MySQL удалить строку из нескольких таблиц

Это правильный способ сделать это?

DELETE t1, t2, t3, t4 FROM 
  table1 as t1 
  INNER JOIN  table2 as t2 on t1.id = t2.id
  INNER JOIN  table3 as t3 on t1.id=t3.id
  INNER JOIN  table4 as t4 on t1.id=t4.id
  WHERE  t1.username='%s' AND t1.id='%s'

person salmane    schedule 06.02.2010    source источник
comment
Похоже, вы пытаетесь удалить строку из нескольких таблиц, где каждая строка имеет общий идентификатор... это правильно?   -  person John Weldon    schedule 06.02.2010
comment
Да, это именно то, что я пытаюсь сделать. извините, что не добавил это в описание   -  person salmane    schedule 06.02.2010
comment
Ну ты его запускал? Либо сделайте это и спросите, когда это не сработает, либо обратитесь к руководству: dev .mysql.com/doc/refman/5.5/en/delete.html   -  person Felix Kling    schedule 06.02.2010
comment
Я сделал ..удалил только запись из таблицы 4   -  person salmane    schedule 06.02.2010
comment
Вы просто пытаетесь выполнить каскадное удаление для нормализованной базы данных?   -  person Joe Phillips    schedule 06.02.2010
comment
Может быть, вам следует изложить свою проблему в вопросе.   -  person Felix Kling    schedule 06.02.2010
comment
Почему вам нужно проверять как имя пользователя, так и идентификатор в вашем предложении where? Идентификатор не уникален?   -  person Mark Byers    schedule 06.02.2010


Ответы (3)


Да, это правильно. Здесь отлично работает:

CREATE TABLE table1 (id int, username nvarchar(30));
CREATE TABLE table2 (id int);
CREATE TABLE table3 (id int);
CREATE TABLE table4 (id int);

INSERT INTO table1 VALUES (1, 'Foo'),(2, 'Bar');
INSERT INTO table2 VALUES (1),(2);
INSERT INTO table3 VALUES (1),(2);
INSERT INTO table4 VALUES (1),(2);

SELECT COUNT(*) FROM table1;
2
SELECT COUNT(*) FROM table2;
2
SELECT COUNT(*) FROM table3;
2
SELECT COUNT(*) FROM table4;
2

DELETE t1, t2, t3, t4 FROM
  table1 as t1
  INNER JOIN  table2 as t2 on t1.id = t2.id
  INNER JOIN  table3 as t3 on t1.id=t3.id
  INNER JOIN  table4 as t4 on t1.id=t4.id
  WHERE  t1.username='Foo' AND t1.id='1';

SELECT COUNT(*) FROM table1;
1
SELECT COUNT(*) FROM table2;
1
SELECT COUNT(*) FROM table3;
1
SELECT COUNT(*) FROM table4;
1

Если это не работает для вас, возможно, вы можете изменить этот пример, чтобы показать, какая у вас проблема.

person Mark Byers    schedule 06.02.2010
comment
Есть ли разница между тем, что вы опубликовали (я пробовал), и ответом, опубликованным выше? : Удалить из таблицы 1 как t1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблицы 2 как t2 по t1.id = t2.id ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблицы 3 как t3 по t1.id=t3.id ВНУТРЕННЕЕ СОЕДИНЕНИЕ таблицы 4 как t4 по t1.id=t4.id ГДЕ t1.username= '%s' AND t1.id='%s' - если да, то какой из них лучше? Спасибо - person salmane; 06.02.2010
comment
@salmane: Да, главное отличие в том, что другой ответ вообще не работает (попробуйте - выдает синтаксическую ошибку). Хотя сейчас он его изменил. - person Mark Byers; 06.02.2010
comment
Настоящий способ сказать спасибо — отметить этот вопрос как ответ и отдать должное Марку. - person Jay Askren; 06.02.2010
comment
Это работает, только если id = 1 существует во всех четырех таблицах. Если вы хотите удалить строку из любой таблицы, которая может иметь id = 1, вы не можете сделать это с помощью одного оператора удаления. - person Kevin Cantwell; 29.09.2015

Простой способ понять это — сначала написать это как запрос:

SELECT * FROM 
        table1 as t1 
        INNER JOIN  table2 as t2 on t1.id = t2.id
        INNER JOIN  table3 as t3 on t1.id=t3.id
        INNER JOIN  table4 as t4 on t1.id=t4.id
        WHERE  t1.username='%s' AND t1.id='%s'

Если вы получите ожидаемые результаты, просто замените *Select ** на Delete и имена ваших таблиц. Тогда это станет:

Delete t1, t2, t3, t4 From table1 as t1 
        INNER JOIN  table2 as t2 on t1.id = t2.id
        INNER JOIN  table3 as t3 on t1.id=t3.id
        INNER JOIN  table4 as t4 on t1.id=t4.id
        WHERE  t1.username='%s' AND t1.id='%s'
person Jay Askren    schedule 06.02.2010

Сделайте это просто с помощью:

DELETE FROM `Table1` t1, `Table2` t2 USING t1, t2
WHERE t1.`id` =  t2.`id` AND t1.`id` = 10; <br>

Наслаждаться :)

person Nadeem    schedule 26.06.2014