У мене є 2 таблиці: Т1 і Т2, це вже існуючі таблиці з даними. Між Т1 і Т2 є зв'язок "один до багатьох". Як мені змінити визначення таблиць, щоб виконати каскадне видалення в SQL Server, коли видаляється запис з Т1, всі пов'язані з ним записи в Т2 також видаляються.
Між ними встановлено зовнішнє обмеження. Я не хочу видаляти таблиці або створювати тригер, щоб виконати видалення для T2. Наприклад, коли я видаляю співробітника, всі записи про рецензії також повинні зникнути.
T1 - Працівник,
Employee ID
Name
Status
T2 - Атестація,
Employee ID - 2009 Review
Employee ID - 2010 Review
Вам доведеться,
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
Використовуйте щось на кшталт
ALTER TABLE T2
ADD CONSTRAINT fk_employee
FOREIGN KEY (employeeID)
REFERENCES T1 (employeeID)
ON DELETE CASCADE;
Заповніть правильні назви стовпців, і все буде готово. Як правильно зазначив mark_s, якщо у вас вже є обмеження зовнішнього ключа, можливо, вам потрібно спочатку видалити старе обмеження, а потім створити нове.
Спочатку потрібно увімкнути властивість 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:.
зніміть існуюче обмеження зовнішнього ключа
додайте нове з включеним параметром 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