Wie kann ich überprüfen, ob ein Index auf einem Tabellenfeld in MySQL existiert?

StackOverflow https://stackoverflow.com/questions/127156

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe bei Google benötigt, um diese ein paar Mal, so dass mein Q / A Ich teile.

War es hilfreich?

Lösung

Verwenden Sie SHOW INDEX etwa so:

SHOW INDEX FROM [tablename]

Text & Tabellen: https://dev.mysql.com/ doc / refman / 5.0 / de / show-index.html

Andere Tipps

Versuchen:

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

Es wird Ihnen sagen, wenn es einen Index aller Art auf eine bestimmte Spalte, ohne die Notwendigkeit, den Namen auf den Index zu wissen gegeben. Es wird auch in einer gespeicherten Prozedur arbeitet (im Gegensatz Index zeigen)

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

Sie können feststellen, ob es einen eindeutigen Schlüssel in der Tabelle vorhanden

show index from table_name where Column_name='column_name';

Verwenden Sie die folgende Anweisung: SHOW INDEX FROM your_table

Und dann überprüfen Sie das Ergebnis für die Felder: row [ "Table"], row [ "Key_name"]

Stellen Sie sicher, "Key_name" richtig

schreiben

schaut nur auf einem Tabellen-Layout aus dem cli. Sie tun würden,

  

desc Mytable

oder

  

zeigt Tabelle mytable

Wenn Sie die Funktionalität, wenn ein Index für eine Spalte existiert müssen (hier an erster Stelle in der Reihenfolge) als Datenbank-Funktion können Sie diesen Code verwenden / nehmen. Wenn Sie möchten, zu überprüfen, ob ein Index überhaupt existiert unabhängig von der Position in einem mehrspaltigen-Index, dann löschen Sie einfach den Teil „und 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 ;

können Sie die folgende SQL-Anweisung verwenden, um die angegebene Spalte auf dem Tisch zu überprüfen, wurde indiziert oder nicht

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;

da die Verbindungen sind gegen INNODB_SYS_ *, so dass der Spiel-Indizes kam nur aus InnoDB-Tabellen nur

Sie können nicht eine bestimmte Show Index Abfrage ausführen, weil es einen Fehler aus, wenn ein Index existiert nicht. Daher müssen Sie durch sie alle Indizes in ein Array und Schleife greifen, wenn Sie irgendwelche SQL-Fehler zu vermeiden.

Hier ist, wie ich es tun. Ich packe alle Indizes aus der Tabelle (in diesem Fall leads) und dann in einer foreach-Schleife, prüfen Sie, ob der Spaltenname (in diesem Fall province) existiert oder nicht.

$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;
    }
}

So kann man wirklich den Index Attribute eingrenzen. Sie eine print_r von $res, um zu sehen, was Sie können mit arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top