如何查找数据库中没有显式主键的所有表?

Pro*_*ofK 10 sql-server primary-key sql-server-2012

Google 搜索在如何查找没有聚集索引的表上产生了数百万次点击,PK 通常是表的聚集索引。然而,一个表很容易有一个自然键作为聚集索引,和一个非聚集代理索引,如标识列。

如何在没有定义主键的情况下查找数据库中的所有表?我在这个数据库中有 245 个表:手动检查效率非常低。

Mik*_*lsh 13

给这只猫剥皮的几种方法,但这在 SQL Server 2005 及更高版本中运行良好,我发现这是一种处理问题的无痛方法 -

OBJECTPROPERTY()函数可以列出有关对象的各种属性 - 如表格。这些属性之一是表是否具有主键。

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0 将是一个没有主键的表。

所以

SELECT OBJECT_SCHEMA_NAME( object_id ) as SchemaName, name AS TableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'tablehasprimaryKey') = 0 
ORDER BY SchemaName, TableName ;
Run Code Online (Sandbox Code Playgroud)

应该给你你需要的。您可以在在线书籍中看到有关使用 OBJECTPROPERTY() 函数的所有其他方法。这是文章2012 版。


Jon*_*gel 5

Mike 的解决方案非常适合特定问题。

如果你想要更多的灵活性,这里是一个可以很容易演变成一个查询的替代方案,返回其他信息,如发现有堆所有表,或发现没有唯一约束的表在所有

SELECT
    OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
    t.name AS TableName
    FROM sys.tables t
    WHERE
        NOT EXISTS
        (
            SELECT *
                FROM sys.indexes i
                WHERE
                    (i.object_id = t.object_id) AND
                    (i.is_primary_key = 1)
        );
Run Code Online (Sandbox Code Playgroud)

一旦您的(子)系统超过约 50 个表,熟悉所有元数据表就非常重要,因为正如您所说,手动浏览每个表是不切实际的(并且容易出错!)。