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不起作用。
一种可能性是有'ON DELETE CASCADE'添加到您的外键约束,但这可能会引发一连串的记录删除两个表。 – 2012-02-14 11:00:28
认为 - 并不真正可行。也被视为ProjectTasks上的插入/更新触发器之后(插入必须始终与DefaultValue一起进入NULL,则会检查更新)。 – kpollock 2012-02-14 11:04:23
您应该删除'DefaultTaskValue'列并创建另一个'DefaultTaskvalue'表。这样,所有列都可以设置为“NOT NULL”。 – 2012-02-14 11:15:56