Как использовать каскадное удаление с SQL Server?

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

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

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

Employee ID      
Name
Status

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

Employee ID - 2009 Review
Employee ID - 2010 Review

Ответ 1

Вам нужно будет,

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

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

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

ALTER TABLE dbo.T2
   ADD CONSTRAINT FK_T1_T2_Cascade
   FOREIGN KEY (EmployeeID) REFERENCES dbo.T1(EmployeeID) ON DELETE CASCADE

Ответ 2

Чтобы добавить "Каскадное удаление" к существующему внешнему ключу в 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, которые ссылаются на конкретную таблицу.

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

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

Ответ 3

Вы можете сделать это с помощью SQL Server Management Studio.

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

SQL Server Management Studio

Ответ 4

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

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

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

Ответ 5

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, также будут удалены.

Ответ 6

Сначала включить свойство ONCascade:

1.Нажмите существующее ограничение внешнего ключа

2.add новый с включенным параметром 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

Ответ 7

##

Soy nuevo en sql llevo como 2 семантики и установление реализаций в 3-х недолгосрочных периодах без изменений в общих законах и изменениях. Este es mi codigo:

создать таблицу Habitaciones (   HabitacionId int первичный ключ идентичности (1,1),   NumeroHabitacion varchar (20) не нулевой,   TipoHabitacionId int not null,   ограничение FK_Habitaciones_TipoHabitaciones   ссылки на внешний ключ (TipoHabitacionId) TipoHabitaciones (TipoHabitacionId)   на каскаде удаления   на каскаде обновлений,   EstadoHabitacionId int not null,   ограничение Fk_Habitaciones_EstadoHabitaciones   внешний ключ (EstadoHabitacionId) ссылается на EstadoHabitaciones (EstadoHabitacionId)   на каскаде удаления   на каскаде обновлений,   EstadoCampoId int not null,   ограничение FK_Habitaciones_EstadoCampos   внешний ключ (EstadoCampoId) ссылается на EstadoCampos (EstadoCampoId)   на каскаде удаления   на каскаде обновлений )

Ответ 8

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

Ответ 9

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