显示数据库中所有表的所有约束

112
如何从MySQL数据库中获取所有约束的列表?

2
MySQL中有不止一种类型的约束。你指的是哪一种?你能举个例子说明你要找的是什么吗? - Mark Byers
5个回答

172

使用information_schema.table_constraints表获取每个表定义的约束的名称:

select *
from information_schema.table_constraints
where constraint_schema = 'YOUR_DB'

使用information_schema.key_column_usage表格获取那些约束中的字段:

select *
from information_schema.key_column_usage
where constraint_schema = 'YOUR_DB'

如果你说的是外键约束,那么请使用information_schema.referential_constraints

select *
from information_schema.referential_constraints
where constraint_schema = 'YOUR_DB'

1
此列表仅包括唯一约束(UNIQUE)、主键约束(PRIMARY KEY)或外键约束(FOREIGN KEY)。CHECK 约束可能存在,但并不强制执行。通过此查询无法查看 DEFAULT 约束。 - OMG Ponies
MySQL 不存储 CHECK 约束。如果您尝试定义一个,它会解析并悄悄地抛弃它。 - Bill Karwin
1
DEFAULT值不算作约束条件,它存储在information_schema.columns.column_default中。 - Bill Karwin

25

@Senseful给出了很好的答案。

对于那些只想要约束名称列表(而不是其他细节/列)的人,我提供修改后的查询:

SELECT DISTINCT(constraint_name) 
FROM information_schema.table_constraints 
WHERE constraint_schema = 'YOUR_DB' 
ORDER BY constraint_name ASC;

2
如果您需要在找到一个后删除它,请参见此处:https://dev59.com/mXRA5IYBdhLWcg3wwwzD#838412 - r3wt

18

如果您想查看主键和外键约束以及围绕这些约束的规则,例如ON_UPDATE和ON_DELETE,以及列和外部列名称的所有信息,则这真的很有帮助:

这非常有助于查看主键、外键约束以及这些约束周围的规则,例如ON_UPDATE和ON_DELETE,以及列和外部列名称的所有信息:

SELECT tc.constraint_schema,tc.constraint_name,tc.table_name,tc.constraint_type,kcu.table_name,kcu.column_name,kcu.referenced_table_name,kcu.referenced_column_name,rc.update_rule,rc.delete_rule

FROM information_schema.table_constraints tc

inner JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
AND tc.table_name = kcu.table_name

LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
AND tc.table_name = rc.table_name

WHERE tc.constraint_schema = 'my_db_name'

您甚至可以添加一些有关这些列的进一步信息,只需将其添加到SQL中(并选择您想要的列):

LEFT JOIN information_schema.COLUMNS c
ON kcu.constraint_schema = c.table_schema
AND kcu.table_name = c.table_name
AND kcu.column_name = c.column_name

有时候会有"table_name"的问题,但除此之外,一切都完美无缺。 - undefined

1
要查看您的表格的相关约束,请使用以下命令:
select * from information_schema.table_constraints where CONSTRAINT_NAME like 'YOUR_TABLE%';

1
这就是我正在寻找的确切答案。谢谢! - undefined

-3

SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME = "tabnam";

查询表名为"tabnam"的用户约束条件。


1
据我所知,这是在Oracle中,而不是MySQL。 - Pradyumn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接