2012-05-03 17 views
6

Questo è il mio Tabelle:Alter Table Aggiungi colonna con un valore predefinito e FK, tale valore non esistente nella FK Dati di riferimento

membro: Id, ....

prodotto: Id, ....

mio Member tabella sono alcuni valori nessuno se li con id = 0 e non voglio aggiungere qualsiasi membro con id = 0, quindi cerco di eseguire questo script:

ALTER TABLE [Product] 
ADD [Member_Id] BIGINT NOT NULL DEFAULT(0), 
CONSTRAINT [FK_Product_Member] FOREIGN KEY ([Member_Id]) REFERENCES [Member]; 

per cui v'è un errore:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_Product_Member". 

così cerco questo:

SET IDENTITY_INSERT [Member] ON 
INSERT INTO [Member] ([Id]) VALUES (0); 
SET IDENTITY_INSERT [Member] OFF 

ALTER TABLE [Product] 
ADD [Member_Id] BIGINT NOT NULL DEFAULT(0), 
CONSTRAINT [FK_Product_Member] FOREIGN KEY ([Member_Id]) REFERENCES [Member]; 

DELETE FROM [Member] WHERE [Member].[Id] = 0; 

poi il nuovo errore è:

The DELETE statement conflicted with the REFERENCE constraint "FK_Product_Member". 

Se provo a creare di nuovo tutte le tabelle Ovviamente tutto andrà bene con i miei dati persi quindi è necessario disporre di backup, creare tabelle e ripristinare i dati. Quindi c'è un modo per modificare Table con questa situazione? qual è il tuo suggerimento?

risposta

0

il tuo "alter table" è il modo migliore per farlo. Ma all'inizio aggiungi la tabella con valore "0" e questo è "FOREIGN KEY" ma non hai un membro con valore "0" così tu ottieni un errore

il modo migliore come sappiamo è tavolo .alter e poi fare il vero valore per la nuova colonna e quindi alterare la colonna e impostare che al "FOREIGN KEY"

+0

che non è lavorato – Saeid

+0

si può fare un altro way.but questo non è un buon modo (utilizzare un documento di identità valido per il valore defualt e dopo ALTER TABLE edit the FK) –

12

L'unico "valore" che è possibile avere in una tabella di riferimento, in modo tale che il vincolo di chiave esterna non venga applicato, è NULL. Non 0, o qualsiasi altro valore magico.

Quindi la soluzione più ovvia è quella di consentire NULL s:

ALTER TABLE [Product] 
ADD [Member_Id] BIGINT NULL, 
CONSTRAINT [FK_Product_Member] FOREIGN KEY ([Member_Id]) REFERENCES [Member]; 
+0

@Dameien_The_Unbeliever Non posso permettere il valore 'Null' – Saeid

+0

@Saeid - quindi non puoi avere il tuo vincolo di chiave esterna. –

+2

@Saeid: se non puoi avere NULL, cosa significa uno 0 per un valore di Product.Member_id significa? Se significa "nessun membro", allora è necessario un valore nullo. È o quello o devi fare un membro "falso" con id = 0 per avere il vincolo di chiave esterna. –

Problemi correlati