2010-10-23 75 views
162

我有我尝试设置PK FK关系的表格,但我想验证这一点。我如何显示PK/FK限制?我看到了this手册页,但它没有显示示例,我的谷歌搜索也没有结果。我的数据库是凭证1,而我受约束的表是实践和cred_insurances。在表格上显示约束命令

回答

321

我用

SHOW CREATE TABLE mytable; 

这说明你目前的形式,以receate mytable必要的SQL语句。您可以看到所有列及其类型(如DESC),但它还显示约束信息(以及表格类型,字符集等)。

+6

我不认为它显示传入的fk关系?例如'a.col_one引用b.col_one'和'show create table b'将不包含关于上述关系的细节。 – 2014-10-10 09:44:16

+1

我确认此命令不显示外键约束。 – 2016-06-06 22:34:04

+0

注意MariaDB从10开始。2会在这里返回尴尬的结果。 https://jira.mariadb.org/browse/MDEV-15377 – stamster 2018-02-24 18:14:36

6

尝试做:

SHOW TABLE STATUS FROM credentialing1; 

外键约束被列在输出的评论列。

+3

我只在“评论”列中看到表格注释。这可能与InnoDB类型有关。 – clockworkgeek 2012-12-30 13:48:17

+0

评论仅供用户评论。这当然不是FK定义存储的地方!如果它们适合你 - 它必须由你的一些RDBMS工具代表你完成。 – stamster 2018-02-24 18:13:07

80

简单的查询INFORMATION_SCHEMA:

USE INFORMATION_SCHEMA; 
SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "<your_database_name>" 
     AND TABLE_NAME = "<your_table_name>" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 
+7

这是最好的答案,因为它以可以通过编程方式使用的格式为您提供结果。当然,你需要添加一个WHERE子句来缩小结果的范围 – 2014-01-27 10:30:05

+0

这帮助我找到一个具有引用多个外键的'id'列的损坏表。难怪桌子有1452 IntegrityError。 – 2015-09-05 16:03:07

+0

这是很好的答案!谢谢@ Resh32 – simhumileco 2017-08-21 11:57:43

5

您可以使用此:

select 
    table_name,column_name,referenced_table_name,referenced_column_name 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 

还是为了更好的格式化输出使用这样的:

select 
    concat(table_name, '.', column_name) as 'foreign key', 
    concat(referenced_table_name, '.', referenced_column_name) as 'references' 
from 
    information_schema.key_column_usage 
where 
    referenced_table_name is not null 
    and table_schema = 'my_database' 
    and table_name = 'my_table' 
+0

ORA-00942:表或视图不存在 00942. 00000 - “表或视图不存在” *原因: *动作: 行错误:29列:5 第29行是“information_schema.key_column_usage” – noboundaries 2013-08-28 10:37:01

+2

@noboundaries你想上的Oracle,这个问题是关于MySQL – ymajoros 2014-09-12 05:05:58

15

的主要问题与验证答案你将不得不解析输出以获取信息。下面是一个查询让你让他们在一个更有用的方式:

SELECT cols.TABLE_NAME, cols.COLUMN_NAME, cols.ORDINAL_POSITION, 
cols.COLUMN_DEFAULT, cols.IS_NULLABLE, cols.DATA_TYPE, 
    cols.CHARACTER_MAXIMUM_LENGTH, cols.CHARACTER_OCTET_LENGTH, 
    cols.NUMERIC_PRECISION, cols.NUMERIC_SCALE, 
    cols.COLUMN_TYPE, cols.COLUMN_KEY, cols.EXTRA, 
    cols.COLUMN_COMMENT, refs.REFERENCED_TABLE_NAME, refs.REFERENCED_COLUMN_NAME, 
    cRefs.UPDATE_RULE, cRefs.DELETE_RULE, 
    links.TABLE_NAME, links.COLUMN_NAME, 
    cLinks.UPDATE_RULE, cLinks.DELETE_RULE 
FROM INFORMATION_SCHEMA.`COLUMNS` as cols 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS refs 
ON refs.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND refs.TABLE_NAME=cols.TABLE_NAME 
    AND refs.COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cRefs 
ON cRefs.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cRefs.CONSTRAINT_NAME=refs.CONSTRAINT_NAME 
LEFT JOIN INFORMATION_SCHEMA.`KEY_COLUMN_USAGE` AS links 
ON links.TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_SCHEMA=cols.TABLE_SCHEMA 
    AND links.REFERENCED_TABLE_NAME=cols.TABLE_NAME 
    AND links.REFERENCED_COLUMN_NAME=cols.COLUMN_NAME 
LEFT JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS cLinks 
ON cLinks.CONSTRAINT_SCHEMA=cols.TABLE_SCHEMA 
    AND cLinks.CONSTRAINT_NAME=links.CONSTRAINT_NAME 
WHERE cols.TABLE_SCHEMA=DATABASE() 
    AND cols.TABLE_NAME="table" 
6

据我所知做出information_schema请求你需要的权限。如果你需要的键简单的列表,你可以使用这个命令:

SHOW INDEXES IN <tablename> 
+0

感谢,对我 – 2016-07-10 11:19:22

+0

如何呼唤INFORMATION_SCHEMA是比这更好的工作,非常感谢 – 2017-02-21 04:59:26

+0

酷感谢,这是最好的 – 2017-04-11 20:48:17

0

还有一个是Oracle提出所谓mysqlshow

如果用--k keys $table_name选项,将显示键运行它的工具。

SYNOPSIS 
    mysqlshow [options] [db_name [tbl_name [col_name]]] 
....... 
....... 
....... 
· --keys, -k 
    Show table indexes. 

例如:

╰─➤ mysqlshow -h 127.0.0.1 -u root -p --keys database tokens 
Database: database Table: tokens 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| Field   | Type    | Collation   | Null | Key | Default | Extra   | Privileges      | Comment | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
| id    | int(10) unsigned |     | NO | PRI |   | auto_increment | select,insert,update,references |   | 
| token   | text    | utf8mb4_unicode_ci | NO |  |   |    | select,insert,update,references |   | 
| user_id   | int(10) unsigned |     | NO | MUL |   |    | select,insert,update,references |   | 
| expires_in  | datetime   |     | YES |  |   |    | select,insert,update,references |   | 
| created_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
| updated_at  | timestamp  |     | YES |  |   |    | select,insert,update,references |   | 
+-----------------+------------------+--------------------+------+-----+---------+----------------+---------------------------------+---------+ 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name     | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| tokens | 0   | PRIMARY     | 1   | id   | A   | 2   |   |  |  | BTREE  |   |    | 
| tokens | 1   | tokens_user_id_foreign | 1   | user_id  | A   | 2   |   |  |  | BTREE  |   |    | 
+--------+------------+--------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
0

类似于@Resh32,但无需使用USE语句:

SELECT TABLE_NAME, 
     COLUMN_NAME, 
     CONSTRAINT_NAME, 
     REFERENCED_TABLE_NAME, 
     REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "database_name" 
     AND TABLE_NAME = "table_name" 
     AND REFERENCED_COLUMN_NAME IS NOT NULL; 

有用的,例如使用ORM。

+0

那将不会显示实际的约束规则 - 例如'更新CASCADE' – stamster 2018-02-24 18:39:34