2012-02-14 83 views
-1
CREATE TABLE [dbo].[ProjectTasks] 
(
    [TaskID] [int] IDENTITY(1,1) NOT NULL, 
    ... 
    [DefaultTaskValue] [int] NULL 
) 

ALTER TABLE [dbo].[ProjectTasks] ADD CONSTRAINT [PK_ProjectTasks] PRIMARY KEY 
CLUSTERED 
(
    [TaskID] ASC 
) 

ALTER TABLE [dbo].[ProjectTasks] ADD CONSTRAINT [FK_ProjectTasks_TaskValues] 
FOREIGN KEY([TaskID], [DefaultTaskValue]) 
REFERENCES [dbo].[TaskValues] ([TaskID], [Value]) 
GO 

CREATE TABLE [dbo].[TaskValues] 
(
    [TaskID] [int] NOT NULL, 
    [Value] [int] NOT NULL, 
    ... 
) 

ALTER TABLE [dbo].[TaskValues] ADD CONSTRAINT [PK_TaskValues] PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC, 
    [Value] ASC 
) 

ALTER TABLE [dbo].[TaskValues] ADD CONSTRAINT [FK_TaskValues_ProjectTasks] 
FOREIGN KEY([TaskID]) 
REFERENCES [dbo].[ProjectTasks] ([TaskID]) 
GO 

鑑於上述情況,任何表中的記錄都不能刪除 - 是否有任何整潔的解決方案?我想要做的是對鏈接表進行排序,使鏈接表成爲純粹的鏈接表,而不是本身帶有價值。這還沒有到現在,因爲從來沒有要求行被真正刪除的問題(他們被標記,但實際上並未刪除),當然你可以插入,因爲默認值可以爲NULL。SQL Server刪除困境

編輯:爲了響應我的downmarker,我應該提到,我已經考慮了ON DELETE CASCADE和TRIGGER,我正在尋找這些場景的替代方案,並明確ON DELETE SET NULL不起作用。

+0

一種可能性是有'ON DELETE CASCADE'添加到您的外鍵約束,但這可能會引發一連串的記錄刪除兩個表。 – 2012-02-14 11:00:28

+0

認爲 - 並不真正可行。也被視爲ProjectTasks上的插入/更新觸發器之後(插入必須始終與DefaultValue一起進入NULL,則會檢查更新)。 – kpollock 2012-02-14 11:04:23

+0

您應該刪除'DefaultTaskValue'列並創建另一個'DefaultTaskvalue'表。這樣,所有列都可以設置爲「NOT NULL」。 – 2012-02-14 11:15:56

回答

1

我被你的發言

驚訝,當然你可以插入,因爲默認值可以爲NULL

,不得不關注一下吧。 MSKB

具體地,如果複合外鍵上已列 允許空值,和列中的至少一個,在所述插入件或行的 更新中定義,被設置爲空,則外鍵約束條件將被滿足 。這是真實的,即使沒有在相關 表中的一行到任何相應的列匹配。

我想我是不知道的信息。因此,我建議如下命令:

UPDATE ProjectTasks SET DefaultTaskValue = NULL *W 
DELETE TaskValues *W 
DELETE ProjectTasks *W 

* W是你的WHERE條件(上的TaskID等)

+0

啊 - 太棒了,這就是我應該意識到我可以做到的。試試吧... – kpollock 2012-02-14 11:36:45

0

一種解決方法是刪除DefaultTaskValue列並創建另一個DefaultTaskvalues表。這樣,所有列可以設置爲NOT NULL和級聯效果。

ProjectTasks表:

CREATE TABLE [dbo].[ProjectTasks] 
(
    [TaskID] [int] IDENTITY(1,1) NOT NULL, 
    ... 
         --- removed: DefaultTaskValue] [int] NULL 
) 

ALTER TABLE [dbo].[ProjectTasks] 
    ADD CONSTRAINT [PK_ProjectTasks] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC 
) 
GO 

TaskValues表:

CREATE TABLE [dbo].[TaskValues] 
(
    [TaskID] [int] NOT NULL, 
    [Value] [int] NOT NULL, 
    ... 
) 

ALTER TABLE [dbo].[TaskValues] 
    ADD CONSTRAINT [PK_TaskValues] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC, 
    [Value] ASC 
) 

ALTER TABLE [dbo].[TaskValues] 
    ADD CONSTRAINT [FK_TaskValues_ProjectTasks] 
    FOREIGN KEY([TaskID]) 
    REFERENCES [dbo].[ProjectTasks] ([TaskID]) 
GO 

DefaultTaskValues表:

CREATE TABLE [dbo].[DefaultTaskValues] 
(
    [TaskID] [int] NOT NULL, 
    [Value] [int] NOT NULL, 
    ... 
) 

ALTER TABLE [dbo].[DefaultTaskValues] 
    ADD CONSTRAINT [PK_DefaultTaskValues] 
    PRIMARY KEY CLUSTERED 
(
    [TaskID] ASC 
) 

ALTER TABLE [dbo].[DefaultTaskValues] 
    ADD CONSTRAINT [FK_DefaultTaskValues_TaskValues] 
    FOREIGN KEY([TaskID], [Value]) 
    REFERENCES [dbo].[TaskValues] ([TaskID], [Value]) 
GO