列出索引和约束

ali*_*der 12 index sql-server constraint primary-key

我正在查看我继承的应用程序的 SQL Server 数据库。我已经有大约 10 年没有研究过 SQL Server,所以请耐心等待。

我正在查看的数据库表有一个bigint NOT NULL名为的列id,但是,当我检查约束时,我没有看到任何约束,所有数据库表也是如此。

我是否正确假设这些表上没有主键和索引(集群或非集群)?

我运行了以下查询,结果似乎证实了我的怀疑:

//**returns 0**
select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;

//**returns no rows**
select * from sys.indexes
where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE');

//**returns all tables in database**
SELECT name
FROM sys.tables 
WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;
Run Code Online (Sandbox Code Playgroud)

Jer*_*emy 10

这两个查询可能对您有所帮助。第一个将列出数据库中这些表的所有表和索引。如果该表没有出现在列表中,则它没有定义任何索引。这些查询假定 SQL Server 版本为 2005 或更高版本。

SELECT 
    IndexName = QUOTENAME(I.name), 
    TableName =
        QUOTENAME(SCHEMA_NAME(T.[schema_id])) + 
        N'.' + QUOTENAME(T.name), 
    IsPrimaryKey = I.is_primary_key
FROM sys.indexes AS I
INNER JOIN sys.tables AS T
    ON I.[object_id] = T.[object_id]
WHERE
    I.type_desc <> N'HEAP'
ORDER BY 
    TableName ASC, 
    IndexName ASC;
Run Code Online (Sandbox Code Playgroud)

第二个查询将为每个表报告标识列,如果数据库中的每个表上有标识列。

SELECT
    TableName =
        QUOTENAME(SCHEMA_NAME(T.[schema_id])) + 
        N'.' + QUOTENAME(T.name), 
    IdentityColumn = COALESCE(QUOTENAME(C.name), N'No identity column')
FROM sys.tables AS T
LEFT OUTER JOIN sys.columns AS C
    ON T.[object_id] = C.[object_id]
    AND C.is_identity = 1
ORDER BY
    TableName ASC;
Run Code Online (Sandbox Code Playgroud)

要将查询限制为特定表,请添加WHERE类似于以下内容的子句:

WHERE T.name = N'NAME-OF-TABLE'
Run Code Online (Sandbox Code Playgroud)