Как использовать каскадное удаление с SQL Server? - PullRequest
298 голосов
/ 07 июня 2011

У меня есть 2 таблицы: T1 и T2, это существующие таблицы с данными. У нас есть отношения один ко многим между T1 и T2. Как изменить определения таблиц для выполнения каскадного удаления в SQL Server при удалении записи из T1, все связанные записи в T2 также удаляются.

Между ними установлено внешнее ограничение. Я не хочу удалять таблицы или создавать триггер для удаления T2. Например, когда я удаляю сотрудника, все записи о проверке также должны быть удалены.

T1 - Сотрудник,

Employee ID      
Name
Status

T2 - Обзоры производительности,

Employee ID - 2009 Review
Employee ID - 2010 Review

Ответы [ 8 ]

334 голосов
/ 07 июня 2011

Вам потребуется,

  • Отменить существующее ограничение внешнего ключа,
  • Добавить новое с включенной настройкой ON DELETE CASCADE.

Что-то вроде:

ALTER TABLE dbo.T2
   DROP CONSTRAINT FK_T1_T2   -- or whatever it's called

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE
270 голосов
/ 09 марта 2016

Чтобы добавить «Каскадное удаление» к существующему внешнему ключу в SQL Server Management Studio:

Сначала выберите свой внешний ключ и откройте его «DROP and Create To ..» в новом окне запроса.

enter image description here

Затем просто добавьте ON DELETE CASCADE к команде ADD CONSTRAINT:

n И нажмите кнопку «Выполнить», чтобы выполнить этот запрос.

Кстати, чтобы получить список ваших внешних ключей и увидеть, в каких из них включена функция «Каскадное удаление», вы можете запустить этот скрипт:

SELECT 
   OBJECT_NAME(f.parent_object_id) AS 'Table name',
   COL_NAME(fc.parent_object_id,fc.parent_column_id) AS 'Field name',
   delete_referential_action_desc AS 'On Delete'
FROM sys.foreign_keys AS f,
     sys.foreign_key_columns AS fc,
     sys.tables t 
WHERE f.OBJECT_ID = fc.constraint_object_id
AND t.OBJECT_ID = fc.referenced_object_id
ORDER BY 1

И если вы когда-нибудь обнаружите, что не можете DROP конкретную таблицу из-за ограничения внешнего ключа, но не можете определить, какой FK вызывает проблему, вы можете выполнить эту команду:

sp_help 'TableName'

SQL в этой статье перечисляет все FK, которые ссылаются на конкретную таблицу.

Надеюсь, все это поможет.

Извинения за длинный палец. Я просто пытался сделать точку.

153 голосов
/ 10 августа 2014

Это можно сделать с помощью SQL Server Management Studio.

→ Щелкните правой кнопкой мыши дизайн таблицы и перейдите в раздел «Отношения» и выберите внешний ключ на левой панели и на правой панели, развернитеменю «ВСТАВИТЬ и ОБНОВИТЬ спецификацию» и выбрать «Каскад» в качестве правила удаления.

SQL Server Management Studio

43 голосов
/ 07 июня 2011

Используйте что-то вроде

ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;

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

14 голосов
/ 24 февраля 2017

ON DELETE CASCADE
Он указывает, что дочерние данные удаляются при удалении родительских данных.

CREATE TABLE products
( product_id INT PRIMARY KEY,
  product_name VARCHAR(50) NOT NULL,
  category VARCHAR(25)
);

CREATE TABLE inventory
( inventory_id INT PRIMARY KEY,
  product_id INT NOT NULL,
  quantity INT,
  min_level INT,
  max_level INT,
  CONSTRAINT fk_inv_product_id
    FOREIGN KEY (product_id)
    REFERENCES products (product_id)
    ON DELETE CASCADE
);

Для этого внешнего ключа мы указали предложение ON DELETE CASCADE, которое сообщает SQL Server об удалении соответствующих записей в дочерней таблице при удалении данных в родительской таблице. Таким образом, в этом примере, если значение product_id удалено из таблицы продуктов, соответствующие записи в таблице инвентаризации, которые используют этот product_id, также будут удалены.

14 голосов
/ 07 мая 2014

Свойство First To Enable ONCascade:

1. Удалите существующее ограничение внешнего ключа

2.Добавьте новое с включенным параметром ON DELETE CASCADE

Пример:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 

ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

Секунда в отключение свойства ONCascade:

1. Отключить существующее ограничение внешнего ключа

2.Добавитьновый с включенной настройкой ON DELETE NO ACTION

Пример:

IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.Response'))
 BEGIN 
ALTER TABLE [dbo].[Response] DROP CONSTRAINT [FK_Response_Request]  

ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE CASCADE
END

ELSE

 BEGIN 
 ALTER TABLE [dbo].[Response] WITH CHECK ADD CONSTRAINT [FK_Response_Request]  FOREIGN KEY([RequestId])
REFERENCES [dbo].[Request] ([RequestId])
ON DELETE NO ACTION 
END
0 голосов
/ 19 мая 2019

Если отношение один ко многим имеет значение от T1 до T2, то оно не представляет функцию и поэтому не может использоваться для вывода или вывода обратной функции, которая гарантирует, что полученное значение T2 не пропускает кортежи соединения T1, которыедедуктивно действительны, потому что нет дедуктивно действительной обратной функции.(Представление функций было целью первичных ключей.) Ответ в SQL - да, вы можете это сделать.Ответ в отношении отношений - нет, ты не можешь этого сделать.См. Моменты двусмысленности в Codd 1970. От T1 до T2 отношения должны быть много-к-одному.

0 голосов
/ 28 октября 2016

Я думаю, что вы не можете просто удалить свойство таблиц, что если это фактические производственные данные, просто удалить содержимое, которое не влияет на схему таблицы.

...