2012-10-02 19 views
6

Ho ereditato un database SQL Server che ha una tabella con una chiave primaria denominata RecordID. La definizione della tabella e la chiave esterna definita in questo modo:Perché creare un vincolo di chiave esterna che fa riferimento alla chiave primaria della stessa tabella dal campo chiave primaria

CREATE TABLE [dbo].[MyTable](
    [RecordId] [int] IDENTITY(1,1) NOT NULL, 
    [FileName] [nvarchar](255) NOT NULL, 
    [Record] [nvarchar](255) NOT NULL, 
    [ErrorDescription] [nvarchar](255) NULL, 
    [ProcessDate] [datetime] NOT NULL, 
CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [RecordId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[MyTable] WITH CHECK ADD CONSTRAINT [FK_MyTable_MyTable] FOREIGN KEY([RecordId]) 
REFERENCES [dbo].[MyTable] ([RecordId]) 
GO 

ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_MyTable] 
GO 

ho potuto capire questo se la chiave esterna fa riferimento da un campo diverso nella stessa tabella di nuovo al campo chiave primaray che consentirebbe una gerarchia, ma in In questo caso i due campi nella definizione di chiave esterna sono esattamente lo stesso campo. È solo un errore nella definizione originale della tabella e della chiave esterna? O c'è un vero vantaggio in qualche modo a questo?

Grazie in anticipo per il vostro tempo nel rispondere.

+0

Forse controlla se c'è un'altra tabella nel database che sembra * dovrebbe * fare riferimento a questa tabella ma non lo è. –

risposta

4

Poiché la chiave esterna fa riferimento a se stessa, il controllo non può mai fallire. Ciò lo rende, come un vincolo, un no-op, quindi è in ogni senso della parola, estraneo. Qualcuno ha chiaramente commesso un errore nella creazione del vincolo.

Ho pensato che potevo mancare qualcosa, quindi un controllo rapido si è verificato con questo: http://www.dotnetnuke.com/Resources/Forums/forumid/-1/postid/342163/scope/posts.aspx che rafforza il mio sospetto (errore dell'utente). La mia conclusione più istruita è che qualcuno a un certo punto ha pensato di creare un vincolo di tabella autoreferenziale (altra colonna), ma in un malvagio colpo di confusione ha creato questo abominio.

Problemi correlati