为了检索有关列的信息,例如:它们的名称,序号位置,数据类型等,我使用以下查询
SELECT *
FROM information_schema.`COLUMNS`
WHERE TABLE_SCHEMA = 'myDbName'
AND TABLE_NAME = 'myTable'
这将返回我需要的所有信息,除了有关哪些列是PK和FK的信息,尤其是FK。我注意到该查询返回的其中一列是COLUMN_KEY
。对于PK,此列就足够了,因为它的值为PRI
,但对于FK,此列要么为MUL
,要么为空。有没有办法可靠地检索有关包含关键信息的列的信息?
我不需要知道有关PK或FK的详细信息,我只想获取有关列的信息并知道它们是PK还是FK。
答案 0 :(得分:1)
这应该为您提供列,键和FK约束的概述。我已经安排了键来区分引用另一个表的那些键和那些不引用另一个表的键,这有点违背了底层视图的自然顺序。您可以添加或删除列以满足您的要求,但您可以获得详细程度,也可以运行show create table table_name
。
N.B。,这应该适用于mysql> 5.7.6,如果您使用的是早期版本,那么您需要从SELECT中删除generation_expression
。
SELECT c.`ordinal_position` AS '#',
c.`column_name` AS 'Name',
c.`column_type` AS 'Type',
c.`is_nullable` AS 'Allow NULL',
IFNULL(c.`column_default`,'') AS 'Default',
CONCAT(c.`extra`, ' ',c.`generation_expression`) AS 'Extra',
IFNULL((SELECT GROUP_CONCAT(CONCAT(IF(s.`non_unique` = 0 ,'*',''),s.`index_name`, '(', s.`seq_in_index`,')'))
FROM `information_schema`.`statistics` s
WHERE s.`table_schema` = c.`table_schema`
AND s.`table_name` = c.`table_name`
AND s.`column_name` = c.`column_name`
),'') as 'Key name(pos) *=unique',
IFNULL((SELECT GROUP_CONCAT(
CONCAT(k.`constraint_name`, ': ', k.`referenced_table_name`,' (', k.`referenced_column_name`,')'))
FROM `information_schema`.`key_column_usage` k
WHERE k.`table_schema` = c.`table_schema`
AND k.`table_name` = c.`table_name`
AND k.`column_name` = c.`column_name`
AND k.`referenced_table_name` IS NOT NULL
),'') AS 'FK name: table(column)'
FROM `information_schema`.`columns` c
WHERE c.`table_schema` = 'dbname'
AND c.`table_name` = 'table_name'
ORDER BY c.ordinal_position;
答案 1 :(得分:0)
假设您正在为表使用INNODB
,您可以使用以下脚本找出密钥是外键还是主键
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE IN ('FOREIGN KEY', 'PRIMARY KEY')
AND information_schema.TABLE_CONSTRAINTS.TABLE_SCHEMA = 'myschema'
AND information_schema.TABLE_CONSTRAINTS.TABLE_NAME = 'mytable';