-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

鉴于上述情况,任何一个表中的记录都不能被删除 - 有什么巧妙的解决方案吗?我想做的是对设计进行排序,使链接表成为一个纯粹的链接表,而不是让它本身携带价值。到目前为止,这还不是问题,因为从不需要实际删除行(它们被标记,但没有实际删除),当然您可以插入,因为 DefaultValue 可以为 NULL。

编辑:作为对我的降级的回应,我应该提到,我已经考虑过 ON DELETE CASCADE 和 TRIGGER,我正在寻找这些场景的替代方案,显然 ON DELETE SET NULL 将不起作用。

4

2 回答 2

1

我对你的说法感到惊讶

当然你可以插入,因为 DefaultValue 可以是 NULL

并且不得不查一下。MSKB

具体来说,如果在允许空值的列上定义了复合外键,并且在插入或更新行时,至少有一个列被设置为空,那么外键约束将被满足。即使相关表中没有任何对应列与之匹配的行也是如此。

我想我不知道这些信息。所以我建议使用以下命令:

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

*W 是您的 WHERE 条件(在 TaskID 等上)

于 2012-02-14T11:20:53.857 回答
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
于 2012-02-14T11:23:41.633 回答