【发布时间】:2010-09-12 17:35:03
【问题描述】:
我需要用 Google 搜索几次,所以我分享了我的 Q/A。
【问题讨论】:
我需要用 Google 搜索几次,所以我分享了我的 Q/A。
【问题讨论】:
补充 GK10 的建议:
使用以下语句:SHOW INDEX FROM your_table
然后检查字段的结果:row["Table"], 行["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"];
}
【讨论】:
试试这个:
SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = "{DB_NAME}"
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
【讨论】:
如果您需要该功能,如果列的索引存在(这里按顺序排列在第一位)作为数据库函数,您可以使用/采用此代码。 如果你想检查一个索引是否存在而不管在多列索引中的位置,那么只需删除“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 ;
【讨论】:
使用以下语句:SHOW INDEX FROM your_table
然后检查字段的结果:row["Table"], row["Key_name"]
确保你正确地写“Key_name”
【讨论】:
您可以使用以下 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 表
【讨论】:
您无法运行特定的显示索引查询,因为如果索引不存在,它将引发错误。因此,如果您想避免任何 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 以查看您可以使用的内容。
【讨论】:
show index from table_name where Column_name='column_name';
【讨论】:
像这样使用SHOW INDEX:
SHOW INDEX FROM [tablename]
【讨论】:
my_table 的索引 WHERE Key_name = 'index_to_check';
SHOW KEYS FROM tablename WHERE Key_name='unique key name'
可以查找表中是否存在唯一键
【讨论】:
试试:
SELECT * FROM information_schema.statistics
WHERE table_schema = [DATABASE NAME]
AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]
它会告诉您是否在某个列上有任何类型的索引,而无需知道索引的名称。它也可以在存储过程中工作(而不是显示索引)
【讨论】:
仅查看 cli 中的表格布局。你会做的
描述我的表
或
显示表mytable
【讨论】: