列出给定表的所有约束
需求描述
需求:查询出给定的表emp的相关的约束信息。
解决方法:通过各个数据库里提供的与约束相关的数据字典进行查询。
注: 数据库数据集SQL脚本详见如下链接地址
员工表结构和数据初始化SQL脚本
SQL代码
-- Sql Server:
SELECT B.name AS Constraint_Name,
B.type,
CASE B.type WHEN 'PK' THEN '主键'
WHEN 'F' THEN '外键'
WHEN 'D' THEN '默认值约束'
WHEN 'C' THEN '检查约束' END AS ConstaintType_Desc,
CASE B.type WHEN 'PK' THEN G.COLUMN_NAME
WHEN 'F' THEN G.COLUMN_NAME
WHEN 'D' THEN E.name
WHEN 'C' THEN F.name END AS Column_name,
CASE B.type WHEN 'PK' THEN NULL
WHEN 'F' THEN NULL
WHEN 'D' THEN C.definition
WHEN 'C' THEN D.definition END AS Define,
B.create_date AS Create_Time,
B.modify_date AS Modify_Time
FROM sys.all_objects A
JOIN sys.all_objects B
ON A.object_id = B.parent_object_id
JOIN sys.default_constraints C
ON B.parent_object_id = B.parent_object_id
JOIN sys.check_constraints D
ON B.parent_object_id = D.parent_object_id
JOIN sys.all_columns E
ON E.object_id = C.parent_object_id
AND C.parent_column_id = E.column_id
JOIN sys.all_columns F
ON F.object_id = D.parent_object_id
AND D.parent_column_id = F.column_id
LEFT JOIN information_schema.key_column_usage G
ON B.name = G.CONSTRAINT_NAME
WHERE A.NAME = 'EMP'
执行结果
注:
1 数据库对象类型这列为自己添加的备注。
2 sys.all_objects里的type的枚举类型有如下:
-- Mysql:
-- 注意mysql内并无同一视图可以满足上述需求。
-- Oracle:
SELECT A.CONSTRAINT_NAME,A.TABLE_NAME,A.COLUMN_NAME,B.CONSTRAINT_TYPE
FROM USER_CONS_COLUMNS A, USER_CONSTRAINTS B
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND A.TABLE_NAME = 'EMP'