Эффективность при удалении строк в двух таблицах - PullRequest
1 голос
/ 21 июля 2011

У меня есть table1 (id_table1) и table2 (id_table2, id_table1).Я хотел бы удалить записи в таблице2 (при заданном условии), но затем также удалить элементы в таблице1, которые больше не связаны с таблицей2.Какой самый эффективный способ сделать это в SQL?Я использую mySql.

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 21 июля 2011

Если вы используете InnoDB, добавьте ограничение внешнего ключа с ON DELETE CASCADE. Это автоматически удалит строки, если связь больше не верна. Таким образом, вам не нужно запрашивать базу данных после удаления строк в таблице 2, чтобы проверить, остается ли связь неизменной.

Ограничения внешнего ключа

0 голосов
/ 21 июля 2011

Предполагая, что вы не настроили никаких каскадных удалений, и так как вы спросили, как это сделать в sql, я вижу два варианта:

1) удалить из таблицы2 где (условие)

delete from table1 where id not in (select distinct id_table1 from table2)

2) удалить из таблицы1, где идентификатор в (выбрать отличный идентификатор_таблицы1 из таблицы2, где (условие))

delete from table2 where id_table2 not in (select id from table1)

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

Это заставляет меня думать, что метод 1 немного более эффективен, если размеры таблиц очень и очень велики.

0 голосов
/ 21 июля 2011

В дополнение к ответу cularis менее эффективный вариант, если вы используете MyISAM, у вас нет ограничений внешнего ключа.

Создайте триггер:

DELIMITER $$

CREATE TRIGGER ad_table1_each AFTER DELETE ON table2 FOR EACH ROW
BEGIN
  DELETE FROM table1 WHERE table1.table2_id = OLD.id;
END $$

DELIMITER ;

http://dev.mysql.com/doc/refman/5.5/en/triggers.html
http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html

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