117

如何检查 MySQL 中表字段上是否存在索引?

我已经多次需要谷歌了,所以我分享了我的 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]

它会告诉您某个列上是否有任何类型的索引,而无需知道索引的名称。它也可以在存储过程中工作(而不是显示索引)

于 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 回答
6

使用以下语句:

SHOW INDEX FROM *your_table*

然后检查字段的结果:row["Table"],row["Key_name"]

确保正确写入“Key_name”

于 2017-12-30T18:36:56.057 回答
1

要从 CLI 查看表的布局,您可以使用

desc mytable

或者

show table mytable
于 2008-09-24T13:36:50.543 回答
1

添加到 GK10 建议的内容:

使用以下语句:SHOW INDEX FROM your_table

然后检查字段的结果: row["Table"], row["Key_name"]

确保正确写入“Key_name”

可以将其转化为 PHP(或其他语言),并包裹在一条 sql 语句中以查找索引列。基本上,您可以将 SHOW INDEX FROM 'mytable' 的结果提取到 PHP 中,然后使用列 'Column_name' 来获取索引列。

制作您的数据库连接字符串并执行以下操作:

$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$sql =  "SHOW INDEX FROM 'mydatabase.mytable' WHERE Key_name = 'PRIMARY';" ;
$result = mysqli_query($mysqli, $sql);

while ($row = $result->fetch_assoc()) {
    echo $rowVerbatimsSet["Column_name"];
}
于 2021-03-06T02:24:58.383 回答
0

您可以使用以下 SQL 来检查表上的给定列是否被索引:

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;

由于连接是针对 INNODB_SYS_*,匹配索引仅来自 INNODB 表。

于 2017-06-29T09:21:13.147 回答
0

如果您需要检查列的索引是否作为数据库函数存在,您可以使用/采用此代码。如果您想检查索引是否存在而不管多列索引中的位置,那么只需删除 part 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 回答
0

尝试使用这个:

SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "{DB_NAME}" 
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
于 2020-05-13T07:29:19.827 回答
-3

您不能运行特定的显示索引查询,因为如果索引不存在,它将引发错误。因此,如果您想避免任何 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 回答