2012-05-03 60 views
6

沒有現成這是我的表:ALTER TABLE添加列有默認值和FK,該值在FK引用數據

會員:身份證,....

產品:身份證, ....

Member表有一定的價值,如果沒有他們ID = 0,我不希望添加任何成員與ID = 0,所以我嘗試運行此腳本:

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

所以有一個錯誤:

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

所以我試試這個:

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; 

那麼新的錯誤是:

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

如果我再次嘗試創建的所有表,每件事情都會好的,當然我的數據丟失了,所以需要備份,創建表格和恢復數據。那麼在這種情況下有沒有辦法改變Table?你的建議是什麼?

回答

0

你的「alter table」是做這件事的更好的方法。但是,首先你要添加值爲「0」的表,這是「FOREIGN KEY」,但你沒有一個值爲「0」的成員,所以你得到錯誤。

爲知道的最好的辦法是.alter表,然後讓真正價值的新列,然後改變列,並設置爲「主鍵」

+0

這沒有奏效 – Saeid

+0

你可以做一個又一個way.but這不是一個好方法(使用defualt價值和ALTER TABLE之後的有效ID編輯FK) –

12

唯一的「價值」,你可以在引用表中有這樣的外鍵約束不被強制執行,是NULL。不是0,或任何其他魔術值。

那麼顯而易見的解決方案是讓NULL S:

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

@Dameien_The_Unbeliever我不能允許'空值' – Saeid

+0

@Saeid - 那麼你不能有你的外鍵約束。 –

+2

@Saeid:如果你不能有NULL,那麼Product.Member_id的值是什麼意思?如果它的意思是「沒有成員」,那麼null是適當的。無論是或者你必須製作一個id = 0的「假」成員才能擁有外鍵約束。 –