Подтвердить что ты не робот

Как удалить строки в таблицах, которые содержат внешние ключи для других таблиц

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

Как написать этот запрос?

4b9b3361

Ответ 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