-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言う

具体的には、NULL を許可する列で複合外部キーが定義されていて、行の挿入または更新時に少なくとも 1 つの列が NULL に設定されている場合、外部キー制約が満たされます。これは、対応する列が一致する関連テーブルに行がない場合でも当てはまります。

この情報は知らなかったと思います。したがって、次のコマンドをお勧めします。

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

*W は WHERE 条件です (TaskID など)

于 2012-02-14T11:20:53.857 に答える
0

DefaultTaskValue1 つの解決策は、列を削除して別の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 に答える