2012-02-14 82 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