Question

J'ai eu besoin de Google ceci plusieurs fois, donc je partage mon Q / A.

Était-ce utile?

La solution

Utilisez SHOW INDEX comme suit:

SHOW INDEX FROM [tablename]

Docs: https://dev.mysql.com/ doc / refman / 5.0 / fr / show-index.html

Autres conseils

Essayez:

SELECT * FROM information_schema.statistics 
  WHERE table_schema = [DATABASE NAME] 
    AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]

Il vous dira s’il existe un index de quelque nature que ce soit sur une certaine colonne sans avoir besoin de connaître le nom donné à l’index. Cela fonctionnera également dans une procédure stockée (par opposition à show index)

SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

vous pouvez trouver s'il existe une clé unique dans la table

show index from table_name where Column_name='column_name';

Utilisez l'instruction suivante: SHOW INDEX FROM votre_table

Ensuite, vérifiez le résultat pour les champs suivants: ligne [" table "], ligne [" nom_clé] "]

Assurez-vous d'écrire " Nom_clé " correctement

il suffit de regarder une disposition de tables de la cli. tu ferais

  

desc mytable

ou

  

show table mytable

Si vous avez besoin de la fonctionnalité si un index pour une colonne existe (ici tout d’abord en séquence) comme fonction de base de données, vous pouvez utiliser / adopter ce code. Si vous souhaitez vérifier si un index existe quelle que soit sa position dans un index multi-colonnes, supprimez simplement la partie "AND AND SEQ_IN_INDEX = 1".

DELIMITER $
CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
    `IN_SCHEMA` VARCHAR(255),
    `IN_TABLE` VARCHAR(255),
    `IN_COLUMN` VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN

-- Check if index exists at first place in sequence for a given column in a given table in a given schema. 
-- Returns -1 if schema does not exist. 
-- Returns -2 if table does not exist. 
-- Returns -3 if column does not exist. 
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');

-- check if schema exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.SCHEMATA
WHERE 
    SCHEMA_NAME = IN_SCHEMA
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -1;
END IF;


-- check if table exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -2;
END IF;


-- check if column exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -3;
END IF;

-- check if index exists at first place in sequence
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    information_schema.statistics 
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;


IF @COUNT_EXISTS > 0 THEN
    RETURN 1;
ELSE
    RETURN 0;
END IF;


END$
DELIMITER ;

vous pouvez utiliser l'instruction SQL suivante pour vérifier si la colonne donnée de la table a été indexée ou non

select  a.table_schema, a.table_name, a.column_name, index_name
from    information_schema.columns a
join    information_schema.tables  b on a.table_schema  = b.table_schema and
                                    a.table_name = b.table_name and 
                                    b.table_type = 'BASE TABLE'
left join (
 select     concat(x.name, '/', y.name) full_path_schema, y.name index_name
 FROM   information_schema.INNODB_SYS_TABLES  as x
 JOIN   information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
 WHERE  x.name = 'your_schema'
 and    y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
where   a.table_schema = 'your_schema'
and     a.column_name  = 'your_column'
order by a.table_schema, a.table_name;

étant donné que les jointures sont contre INNODB_SYS_ *, les index de correspondance ne proviennent que des tables INNODB uniquement

Vous ne pouvez pas exécuter une requête show index spécifique, car une erreur sera générée si un index n'existe pas. Par conséquent, vous devez saisir tous les index dans un tableau et les parcourir si vous souhaitez éviter les erreurs SQL.

Voici comment je le fais. Je récupère tous les index de la table (dans ce cas, mène ) puis, dans une boucle foreach, vérifie si le nom de la colonne (dans ce cas, province ) existe ou non.

$this->name = 'province';

$stm = $this->db->prepare('show index from `leads`');
$stm->execute();
$res = $stm->fetchAll();
$index_exists = false;

foreach ($res as $r) {
    if ($r['Column_name'] == $this->name) {
        $index_exists = true;
    }
}

De cette façon, vous pouvez vraiment réduire les attributs de l'index. Faites un print_r de $ res afin de voir avec quoi vous pouvez travailler.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top