117

MySQL のテーブル フィールドにインデックスが存在するかどうかを確認するにはどうすればよいですか?

これを何度も Google で検索する必要があったので、Q/A を共有します。

4

11 に答える 11

152

SHOW INDEX次のように使用します。

SHOW INDEX FROM [tablename]

ドキュメント: https://dev.mysql.com/doc/refman/5.0/en/show-index.html

于 2008-09-24T13:35:35.960 に答える
39

試す:

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

インデックスに付けられた名前を知る必要なく、特定の列に何らかの種類のインデックスがあるかどうかがわかります。ストアド プロシージャでも機能します (show index とは対照的に)。

于 2012-01-29T06:57:23.780 に答える
9
SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

テーブルに一意のキーが存在するかどうかが表示されます。

于 2012-05-06T13:26:57.337 に答える
9
show index from table_name where Column_name='column_name';
于 2015-03-18T06:00:26.233 に答える
1

CLI からテーブルのレイアウトを確認するには、次を使用します。

desc mytable

また

show table mytable
于 2008-09-24T13:36:50.543 に答える
0

列のインデックスがデータベース関数として存在するかどうかを確認する必要がある場合は、このコードを使用/採用できます。複数列インデックスの位置に関係なく、インデックスが存在するかどうかを確認したい場合は、その部分を削除するだけ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 ;
于 2019-02-04T11:26:55.737 に答える
-3

インデックスが存在しない場合はエラーがスローされるため、特定の show index クエリを実行することはできません。したがって、SQL エラーを回避するには、すべてのインデックスを配列に取り込んでループ処理する必要があります。

これが私のやり方です。テーブル (この場合は ) からすべてのインデックスを取得leadsし、foreach ループで列名 (この場合はprovince) が存在するかどうかを確認します。

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

このようにして、インデックス属性を本当に絞り込むことができます。作業できるものを確認するために を実行しprint_rます。$res

于 2016-11-09T16:46:30.150 に答える