2013-05-20 13 views
6

Ho un grande progetto .sqlproj. In un file sql Ho una definizione di tabella:Perché mi è consentito avere due indici con lo stesso nome?

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

In un altro file sql ho un'altra definizione di tabella:

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

Si noti che entrambi gli indici sono chiamati TableOneIndex. Eppure il progetto si integra e distribuisce bene.

Come può essere legale?

+0

I nomi degli indici devono essere unici per _table_/_view_, non l'intero DB: http://stackoverflow.com/a/1732007/1583 – Oded

+2

Entrambe le colonne sono chiamati 'ColumnName' e questo è anche legale :) – AakashM

risposta

5

Hanno lo stesso nome nelle tabelle SYS.INDEX ma hanno completato diversi OBJECT_ID.

sguardo al sys.tables

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

e poi fare:

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

Dove l'ID oggetto di sono gli ID dalla tabella sys.tables relative alla TableOne e TableTwo

+1

+1 per la spiegazione dettagliata – Stephan

5

Dal momento che sono 2 tavoli separati e TableTwoNON E ' vista TableOne suo perfettamente normale avere lo stesso nome di indice per entrambe le tabelle

nome Indice deve essere univoco all'interno della tabella NON foro db .

+0

+ 1 per l'inclusione della vista. Non avevo pensato a quello. – granadaCoder

9

Le CREATE INDEX specifiche spiegano this:

index_name È il nome dell'indice. I nomi indice devono essere univoci all'interno di una tabella o vista ma non devono essere univoci all'interno di un database. I nomi degli indici devono seguire le regole degli identificatori.

+2

+1 per RTFM .... –

Problemi correlati