INFORMATION_SCHEMA.TABLE_CONSTRAINTS
是一个系统表,它存储了关于数据库中所有表的约束信息。这个表是SQL标准的一部分,大多数关系型数据库管理系统(如MySQL、PostgreSQL、SQL Server等)都提供了类似的表来存储元数据信息。
表结构
以下是 INFORMATION_SCHEMA.TABLE_CONSTRAINTS
表的一些主要列及其含义:
- CONSTRAINT_CATALOG: 约束所在的目录(通常是数据库名)。
- CONSTRAINT_SCHEMA: 约束所在的模式名。
- CONSTRAINT_NAME: 约束的名称。
- TABLE_CATALOG: 表所在的目录(通常是数据库名)。
- TABLE_SCHEMA: 表所在的模式名。
- TABLE_NAME: 表的名称。
- CONSTRAINT_TYPE: 约束的类型。常见的值包括:
-
PRIMARY KEY
: 主键约束。 -
FOREIGN KEY
: 外键约束。 -
UNIQUE
: 唯一性约束。 -
CHECK
: 检查约束。 -
NOT NULL
: 非空约束(某些数据库系统可能不支持此类型)。
- IS_DEFERRABLE: 表示该约束是否可以延迟到事务的末尾进行检查。值为
YES
或NO
。 - INITIALLY_DEFERRED: 表示该约束是否在事务开始时默认延迟检查。值为
YES
或NO
。
示例查询
查找所有主键约束
SELECT
CONSTRAINT_NAME,
TABLE_SCHEMA,
TABLE_NAME,
CONSTRAINT_TYPE
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
CONSTRAINT_TYPE = 'PRIMARY KEY';
查找所有外键约束
SELECT
CONSTRAINT_NAME,
TABLE_SCHEMA,
TABLE_NAME,
CONSTRAINT_TYPE
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
CONSTRAINT_TYPE = 'FOREIGN KEY';
查找特定表的所有约束
SELECT
CONSTRAINT_NAME,
TABLE_SCHEMA,
TABLE_NAME,
CONSTRAINT_TYPE
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE
TABLE_SCHEMA = 'your_schema_name'
AND TABLE_NAME = 'your_table_name';
查找没有主键的表
SELECT
TABLE_SCHEMA,
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = 'your_schema_name'
AND TABLE_NAME NOT IN (
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
AND TABLE_SCHEMA = 'your_schema_name'
);