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になる可能性があるため挿入することができます。SQL Serverの削除のジレンマ
EDIT:私のダウンマーカーに対応して、私は、DELETE CASCADEとTRIGGERの両方を検討しましたが、これらのシナリオの代替案を探していますが、明らかにON DELETE SET NULLは機能しません。
一つの可能性は '持っON CASCADE'があなたの外部キー制約に追加削除することです、それは潜在的にレコードの削除の巨大な連鎖を引き起こす可能性があります両方のテーブル。 –
これは、実用的ではないと考えられています。また、ProjectTasksの挿入後/更新トリガーとみなされます(Insertは常にDefaultValueにNULLを入れなければならず、更新がチェックされます)。 – kpollock
'DefaultTaskValue'カラムを削除し、別の' DefaultTaskvalue'テーブルを作成する必要があります。このようにして、すべての列を 'NOT NULL'として設定することができます。 –