是否可以在数据库中找到所有具有系统生成名称的主键?

时间:2016-05-19 14:47:43

标签: sql sql-server

我知道在db中查找所有主键的几种不同方法,但是是否可以过滤结果,以便它只显示具有系统生成名称的主键?这些查询返回的所有属性都不相关,所以我猜我必须加入另一个表或调用函数,但我找不到任何相关的东西。

SELECT * 
FROM sys.all_objects 
WHERE type_desc = 'PRIMARY_KEY_CONSTRAINT'

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'

我想显示这些结果的原因是我可以在大型数据库中找到并重命名这些约束。

编辑: 系统生成的名称是指通过在表定义中的列名后面添加PRIMARY KEY来创建的主键,因此它的名称如下:PK__Countrie__5D9B0D2D28F35AE2

3 个答案:

答案 0 :(得分:2)

最干净的方式是:

SELECT * 
FROM sys.key_constraints
WHERE type = 'PK'
  AND is_system_named = 1

只需查看is_system_named视图

中的sys.key_constraints媒体资源

答案 1 :(得分:1)

自动生成的PK似乎在其名称中包含16个十六进制数字
所以我会使用这个查询,然后仍然手动检查它的结果。为什么要手动检查?因为上述语句可能只是未记录的内容,并且可能不适用于SQL Server的未来版本。

SELECT * 
FROM sys.all_objects 
WHERE type_desc = 'PRIMARY_KEY_CONSTRAINT'
and
name like '%[A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9]%'

答案 2 :(得分:1)

我最想出的是:

SELECT * 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
AND CONSTRAINT_NAME like 'PK__' + left(TABLE_NAME, 8) +'__[A-Z|0-9]%'