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

上記を考慮すると、どちらのテーブルのレコードも削除できません - すっきりした解決策はありますか?私がしたいのは、リンクテーブルを純粋なリンクテーブルにして、それ自体が値を運ばないようにデザインを並べ替えることです。行は実際には削除される必要はなく(フラグが設定されていても実際には削除されない)、DefaultValueがNULLになる可能性があるため挿入することができます。SQL Serverの削除のジレンマ

EDIT:私のダウンマーカーに対応して、私は、DELETE CASCADEとTRIGGERの両方を検討しましたが、これらのシナリオの代替案を探していますが、明らかにON DELETE SET NULLは機能しません。

+0

一つの可能​​性は '持っON CASCADE'があなたの外部キー制約に追加削除することです、それは潜在的にレコードの削除の巨大な連鎖を引き起こす可能性があります両方のテーブル。 –

+0

これは、実用的ではないと考えられています。また、ProjectTasksの挿入後/更新トリガーとみなされます(Insertは常にDefaultValueにNULLを入れなければならず、更新がチェックされます)。 – kpollock

+0

'DefaultTaskValue'カラムを削除し、別の' DefaultTaskvalue'テーブルを作成する必要があります。このようにして、すべての列を 'NOT NULL'として設定することができます。 –

答えて

1

私はあなたの文

に驚いたとのDefaultValueが

NULLになると、それを見ていた可能性があるため、もちろん、あなたが挿入することができます。複合外部キー列挿入または行の 更新時にヌルを許容 、および列の少なくとも一方を、上に定義されている場合MSKBは、具体的

を言い、その後、nullに設定されています外部キー制約は になります。関連する列が一致する関連する テーブルの行がない場合でも、これは当てはまります。

私はこの情報を知らなかったと思います。だから私は、次のコマンドを提案:

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

* WあなたのWHERE(タスクIDなどの)条件

+0

ああ - 華麗で、私は自分ができると分かっていたはずのことです。それを試してオフ... – kpollock

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 
関連する問題