當創建PK或UK時,SQL Server會自動爲該約束創建唯一索引。這些約束的create_date將與相應索引的創建日期相同。
由於sys.indexes視圖沒有create_date列,因此搜索這類信息絕對沒有用處。而且,這個視圖中的object_id列永遠不會引用相應的約束。它會指向索引所屬的表格。 以下測試將證明這一點:
CREATE TABLE dbo.TEST_T1
(
COLUMN_1 INT NOT NULL,
COLUMN_2 INT NOT NULL,
CONSTRAINT PK_TEST_T1 PRIMARY KEY (COLUMN_1)
)
GO
WAITFOR DELAY '00:00:01';
ALTER TABLE dbo.TEST_T1
ADD CONSTRAINT UK_TEST_T1 UNIQUE (COLUMN_2)
GO
SELECT O.name, O.object_id, O.create_date, I.object_id, I.name AS index_name
FROM sys.objects AS O
LEFT OUTER JOIN sys.indexes AS I ON O.object_id = i.object_id
WHERE O.name IN ('TEST_T1', 'PK_TEST_T1', 'UK_TEST_T1')
結果是:
name object_id create_date object_id index_name
PK_TEST_T1 272720024 2015-03-17 11:02:47.197 NULL NULL
TEST_T1 256719967 2015-03-17 11:02:47.190 256719967 PK_TEST_T1
TEST_T1 256719967 2015-03-17 11:02:47.190 256719967 UK_TEST_T1
UK_TEST_T1 288720081 2015-03-17 11:02:48.207 NULL NULL
所以,如果你想看到的PK或UK指標CREATE_DATE有沒有必要加入與SYS.INDEXES 。你應該從sys.objects中選擇:
SELECT name, object_id, create_date
FROM sys.objects
WHERE name IN ('PK_TEST_T1', 'UK_TEST_T1')
AND type IN ('PK', 'UQ')
結果是:
name object_id create_date
PK_TEST_T1 272720024 2015-03-17 11:02:47.197
UK_TEST_T1 288720081 2015-03-17 11:02:48.207
爲什麼你想創建一個索引的日期? – Ariel
dba.stackexchange.com –
我必須找出在特定表格上創建的最新索引 – vinay