2013-05-20 22 views
6

Tôi có một dự án lớn .sqlproj. Trong một file sql Tôi có một định nghĩa bảng:Tại sao tôi được phép có hai chỉ mục có cùng tên?

CREATE TABLE [dbo].[TableOne] (
    [ColumnName] UNIQUEIDENTIFIER NULL 
); 
GO 
CREATE UNIQUE CLUSTERED INDEX [TableOneIndex] 
    ON [dbo].[TableOne]([ColumnName] ASC; 

trong một file sql Tôi có định nghĩa bảng khác:

CREATE TABLE [dbo].[TableTwo] (
    [ColumnName] UNIQUEIDENTIFIER NULL 
); 
GO 
CREATE UNIQUE CLUSTERED INDEX [TableOneIndex] 
    ON [dbo].[TableTwo]([ColumnName] ASC; 

Lưu ý rằng cả hai chỉ số này được gọi là TableOneIndex. Tuy nhiên, dự án xây dựng tốt và triển khai tốt.

Điều này có thể hợp pháp như thế nào?

+0

tên Index cần phải là duy nhất cho mỗi _table_/_view_, không phải toàn bộ DB: http://stackoverflow.com/a/1732007/1583 – Oded

+2

Cả hai cột được gọi là 'ColumnName' và đó cũng là quy phạm pháp luật :) – AakashM

Trả lời

5

Chúng có cùng tên trong các bảng SYS.INDEX tuy nhiên chúng có hoàn toàn khác nhau OBJECT_ID.

Nhìn vào sys.tables

SELECT * FROM 
    SYS.TABLES 
    WHERE NAME LIKE 'TABLE%' 

và sau đó làm:

SELECT * FROM SYS.INDEXES 
    WHERE OBJECT_ID IN (245575913 
,277576027) 

Trong trường hợp của đối tượng ID là ID từ bảng sys.tables liên quan đến TableOne và TableTwo

+1

+1 để biết giải thích chi tiết – Stephan

5

Vì họ là 2 bảng riêng biệt và TableTwoKHÔNG PHẢI LÀ một cái nhìn của TableOne của nó hoàn toàn bình thường có tên chỉ số tương tự cho cả hai bảng

tên Index phải là duy nhất trong bảng KHÔNG lỗ db .

+0

+ 1 cho việc bao gồm Xem. Đã không nghĩ về điều đó. – granadaCoder

9

Các thông số kỹ thuật CREATE INDEX giải thích điều này:

index_name Là tên của chỉ mục. Tên chỉ mục phải là duy nhất trong bảng hoặc chế độ xem nhưng không phải là duy nhất trong cơ sở dữ liệu. Tên chỉ mục phải tuân thủ các quy tắc của số nhận dạng.

+2

+1 cho RTFM .... –