Дилемма удаления SQL Server - PullRequest
       16

Дилемма удаления SQL Server

0 голосов
/ 14 февраля 2012
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 не будет работать.

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Я был удивлен вашим заявлением

и, конечно, вы можете вставить, потому что DefaultValue может быть NULL

и должен был это найти. MSKB говорит

В частности, если для столбцов был определен составной внешний ключ которые допускают пустые значения и, по крайней мере, один из столбцов при вставке или обновление строки, устанавливается равным нулю, тогда ограничение внешнего ключа будет быть довольным. Это верно, даже если в соответствующем таблица, с которой сопоставляются любые соответствующие столбцы.

Полагаю, я не знал об этой информации. Поэтому я предлагаю следующие команды:

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

* W - ваше условие WHERE (для TaskID и т. Д.)

0 голосов
/ 14 февраля 2012

Одним из решений является удаление столбца 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...