试图找出一个SQL脚本来测试cerain表中是否存在主键。如果表没有主键,则脚本应输出表名。
Tables to test:
TableA
TableB
TableC
运行脚本后(假设TableA和TableC有PK,但不是TableB),输出如下:
NoKeys
TableB
;WITH tables_with_pk AS (
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON t.TABLE_NAME = tc.TABLE_NAME AND t.table_schema = tc.table_schema
WHERE tc.constraint_type = 'PRIMARY KEY'
)
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t
EXCEPT
SELECT table_schema, table_name
FROM tables_with_pk
我没有准确/完整的代码,但这里的想法是:
您需要遍历数据库中的表列表:
SELECT *
FROM information_schema.tables`
检查表是否存在主键的代码如下所示:
SELECT *
FROM information_schema.table_constraints
WHERE constraint_type = 'PRIMARY KEY'
AND table_name = @Your_Table_Name`
如果没有主键,则返回0;如果有主键,则返回1
SELECT OBJECTPROPERTY(OBJECT_ID(N'MyTable'),'TableHasPrimaryKey')
怎么样
USE information_schema;
SELECT `TABLE_NAME` FROM `TABLES` LEFT JOIN `TABLE_CONSTRAINTS` USING(`TABLE_SCHEMA`, `TABLE_NAME`) WHERE `TABLE_SCHEMA` = '__PUT_YOUR_DB_NAME_HERE__' AND `CONSTRAINT_NAME` LIKE '%PRIMARY%' AND ISNULL(`CONSTRAINT_CATALOG`)
我喜欢肖恩的回答,这对我有用。您可以添加该子句
WHERE t.TABLE_TYPE = 'BASE TABLE'
就在EXCEPT
声明之前,如果你不想再获得观点。
;WITH tables_with_pk AS (
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON t.TABLE_NAME = tc.TABLE_NAME AND t.table_schema = tc.table_schema
WHERE tc.constraint_type = 'PRIMARY KEY'
)
SELECT t.table_schema, t.table_name
FROM INFORMATION_SCHEMA.TABLES t
WHERE t.TABLE_TYPE = 'BASE TABLE'
EXCEPT
SELECT table_schema, table_name
FROM tables_with_pk