2014-10-17 3 views
0

здесь усеченную пример моей проблемы:каскадные удаления не работает при удалении из «группировки таблицы»

создать 2 таблицы, которые связаны через «группировки таблицы».

CREATE TABLE table1 
(
    t1_pk INT(11) AUTO_INCREMENT NOT NULL, 
    t1_entry VARCHAR(150), 
    PRIMARY KEY (t1_pk) 
) engine = innodb; 

CREATE TABLE table2 
(
    t2_pk int(11) AUTO_INCREMENT NOT NULL, 
    t2_entry VARCHAR(150), 
    PRIMARY KEY (t2_pk) 
) engine = innodb; 

CREATE TABLE grouping 
(
    grouping_pk INT(11) AUTO_INCREMENT NOT NULL, 
    t1_fk INT(11) NOT NULL, 
    t2_fk INT(11) NOT NULL, 
    PRIMARY KEY (grouping_pk), 
    CONSTRAINT table1_fk FOREIGN KEY (t1_fk) REFERENCES table1 (t1_pk) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT table2_fk FOREIGN KEY (t2_fk) REFERENCES table2 (t2_pk) ON DELETE CASCADE ON UPDATE CASCADE 
) engine = innodb; 

Теперь я хочу, чтобы удалить все записи из группировки, table1 и table2 где table1.t1_entry является «а».

Я пытаюсь сделать это следующим образом:

DELETE FROM grouping 
WHERE grouping.grouping_pk IN (SELECT 
    temp.entry_id 
    FROM (SELECT grouping.grouping_pk, 
      grouping.t1_fk, 
      grouping.t2_fk, 
      table1.t1_pk, 
      table1.t1_entry, 
      table2.t2_pk, 
      table2.t2_entry 
      FROM grouping 
       LEFT OUTER JOIN table1 ON grouping.t1_fk = table1.t1_pk 
       LEFT OUTER JOIN table2 ON grouping.t2_fk = table2.t2_pk 
      WHERE table1.t1_entry LIKE 'abc' 
     ) AS temp) 

В результате записи будут удалены в таблице группировки, но не в table1 и table2.

Вопрос теперь, как я мог выбрать записи и удалить набор результатов из всех таблиц? Я чувствую себя манекеном, потому что я не могу понять это сам.

+1

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

+0

Если вы хотите удалить из других таблиц, когда все группы исчезнут, вам нужно использовать триггер. – Barmar

+1

Правило ON DELETE внешнего ключа работает в обратном порядке, как вы думаете об этом. Если правило DELETE указано как CASCADE так, как вы его ... если строка удалена из ** 'table1' **, то соответствующие строки в **' grouping' ** будут автоматически удалены. Удаление строк из ** 'grouping' ** не влияет на строки в **' table1' **. – spencer7593

ответ

1

Закрыв этот сейчас ...

Заключение: я должен переработать мой DataModel для лучшего решения моей проблемы, на основе Barmar и Spencer7593 комментарии. Спасибо за высокую оценку!

1

В определении таблицы таблицы table2_fk вы ссылаетесь на таблицу1 вместо таблицы2. Может быть, проблема ...

+0

Спасибо - это была опечатка в примере! –

Смежные вопросы