Sql-Server
列出索引和約束
我正在查看我繼承的應用程序的 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;
這兩個查詢可能會對您有所幫助。第一個將列出數據庫中這些表的所有表和索引。如果該表沒有出現在列表中,則沒有在其上定義任何索引。這些查詢假定 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;
第二個查詢將為每個表報告身份列,如果在數據庫中的每個表上有的話。
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;
要將查詢限制為特定表,請添加
WHERE
類似於以下內容的子句:WHERE T.name = N'NAME-OF-TABLE'