удалить строки из нескольких таблиц - PullRequest
7 голосов
/ 09 апреля 2009

Я пытаюсь использовать SQL для удаления нескольких строк из нескольких таблиц, которые объединились.

Таблица A объединена с таблицей B Таблица B объединена с таблицей C

Я хочу удалить все строки в таблице B & C, которые соответствуют строке в таблице A

CREATE TABLE `boards` (
  `boardid` int(2) NOT NULL AUTO_INCREMENT,
  `boardname` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`boardid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `messages`
-- 

CREATE TABLE `messages` (
  `messageid` int(6) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicid` int(4) NOT NULL DEFAULT '0',
  `message` text NOT NULL,
  `author` varchar(255) NOT NULL DEFAULT '',
  `date` datetime DEFAULT NULL,
  PRIMARY KEY  (`messageid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `topics`
-- 

CREATE TABLE `topics` (
  `topicid` int(4) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicname` varchar(255) NOT NULL DEFAULT '',
  `author` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`topicid`)
);

Ответы [ 4 ]

18 голосов
/ 09 апреля 2009

Ну, если бы вы использовали таблицы InnoDB, вы могли бы установить каскадное удаление с внешними ключами , которое бы делало все это автоматически. Но если у вас есть причины для использования MyISAM, вы просто используете DELETE для нескольких таблиц:

DELETE FROM boards, topics, messages
USING boards INNER JOIN topics INNER JOIN messages
WHERE boards.boardid = $boardid
    AND topics.boardid = boards.boardid
    AND messages.boardid = boards.boardid;
6 голосов
/ 09 апреля 2009

это может сделать ваша db-система, если вы используете внешние ключи с "on delete cascade".

Взгляните сюда: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

2 голосов
/ 09 апреля 2009

Вы можете просто проверить наличие

delete from topics where boardid in (select boardid from boards)
delete from messages where boardid in (select boardid from boards)

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

объяснил на миллионе сайтов, в ваших справочных файлах и здесь

1 голос
/ 24 февраля 2014

Удалить строки из нескольких таблиц можно двумя способами:

  • Удалить строки из одной таблицы, определяя, какие строки удалять, ссылаясь на другую таблица
  • Удаление строк из нескольких таблиц одним оператором

Операторы DELETE с несколькими таблицами могут быть записаны в двух форматах. В следующем примере демонстрируется один синтаксис для запроса, который удаляет строки из таблицы t1, где значения идентификатора совпадают со значениями в таблице t2:

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id;

Второй синтаксис немного отличается:

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id;

Чтобы удалить совпадающие записи из обеих таблиц, используйте следующие операторы:

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id;
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id;

Предложения ORDER BY и LIMIT, обычно поддерживаемые UPDATE и DELETE, не допускаются, когда эти операторы используются для операций с несколькими таблицами.

...