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

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

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

Ответы [ 5 ]

21 голосов
/ 07 сентября 2010

Исходя из вашего вопроса, я думаю, можно с уверенностью предположить, что у вас включено Каскадное удаление .
Все что нужно в этом случае это

DELETE FROM MainTable
WHERE PrimaryKey = ???

Ваш движок базы данных позаботится об удалении соответствующих ссылочных записей.

19 голосов
/ 07 сентября 2010

Во-первых, в качестве одноразового упражнения по очистке данных удалите потерянные строки, например,

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;

Тогда, прежде всего, строки в ссылочных таблицах будут автоматически удалены при удалении их ссылочной строки.

8 голосов
/ 07 сентября 2010

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

ALTER TABLE MasterTable
ADD CONSTRAINT fk_xyz 
FOREIGN KEY (xyz) 
REFERENCES ChildTable (xyz) ON DELETE CASCADE 
4 голосов
/ 11 октября 2010

Если у вас есть несколько строк для удаления, и вы не хотите изменять структуру ваших таблиц Вы можете использовать курсор. 1-Сначала вам нужно выбрать строки для удаления (в курсоре) 2-Затем для каждой строки в курсоре вы удаляете ссылочные строки, а затем удаляете строку самостоятельно.

Ex:

--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

надежда полезна

0 голосов
/ 08 февраля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...