Как удалить строки в таблицах, которые содержат внешние ключи для других таблиц
Предположим, что есть основная таблица, содержащая первичный ключ, и есть другая таблица, которая содержит внешний ключ для этой основной таблицы. Поэтому, если мы удалим строку основной таблицы, она также удалит дочернюю таблицу.
Как написать этот запрос?
Ответы
Ответ 1
Из вашего вопроса, я думаю, можно с уверенностью предположить, что вы CASCADING DELETES включили.
Все, что необходимо в этом случае, это
DELETE FROM MainTable
WHERE PrimaryKey = ???
Ваш механизм базы данных позаботится об удалении соответствующих реферирующих записей.
Ответ 2
Во-первых, в качестве одноразового упражнения по очистке данных удалите осиротевшие строки, например.
DELETE
FROM ReferencingTable
WHERE NOT EXISTS (
SELECT *
FROM MainTable AS T1
WHERE T1.pk_col_1 = ReferencingTable.pk_col_1
);
Во-вторых, в качестве одноразового упражнения по изменению схемы добавьте ссылочное действие ON DELETE CASCADE
к внешнему ключу в ссылочной таблице, например.
ALTER TABLE ReferencingTable DROP
CONSTRAINT fk__ReferencingTable__MainTable;
ALTER TABLE ReferencingTable ADD
CONSTRAINT fk__ReferencingTable__MainTable
FOREIGN KEY (pk_col_1)
REFERENCES MainTable (pk_col_1)
ON DELETE CASCADE;
Затем, навсегда, строки в ссылочных таблицах будут автоматически удаляться, когда их ссылочная строка будет удалена.
Ответ 3
Вы можете изменить ограничение внешнего ключа с помощью опции delete cascade, как показано ниже. Это приведет к удалению строк таблицы строк, связанных с строками основных таблиц при удалении.
ALTER TABLE MasterTable
ADD CONSTRAINT fk_xyz
FOREIGN KEY (xyz)
REFERENCES ChildTable (xyz) ON DELETE CASCADE
Ответ 4
Если у вас есть несколько строк для удаления, и вы не хотите изменять структуру своих таблиц
вы можете использовать курсор.
1-Сначала вам нужно выбрать строки для удаления (в курсоре)
2-Затем для каждой строки в курсоре вы удаляете ссылочные строки и после этого удаляете строку самостоятельно.
Пример:
--id is primary key of MainTable
declare @id int
set @id = 1
declare theMain cursor for select FK from MainTable where MainID = @id
declare @fk_Id int
open theMain
fetch next from theMain into @fk_Id
while @@fetch_status=0
begin
--fkid is the foreign key
--Must delete from Main Table first then child.
delete from MainTable where fkid = @fk_Id
delete from ReferencingTable where fkid = @fk_Id
fetch next from theMain into @fk_Id
end
close theMain
deallocate theMain
надежда полезна
Ответ 5
Вам нужно установить параметр внешнего ключа как на удалить каскад.
в таблицах, которые содержат столбцы внешнего ключа.... Его необходимо установить во время создания таблицы или добавить позже, используя таблицу ALTER