SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 15.10.2011 01:28:15

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

AFTER DELETE триггер на дочернюю таблицу для удаления в родительской

Ребята, привет всем!

Подскажите, пожалуйста, следующую вещь. Cкажем, имеются две таблицы parents и childs (поля parentid и childid умышленно не являются первичными ключами):

mysql> describe parents;
+----------+------------------+------+-----+---------+-------+
| Field    | Type             | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| parentid | int(10) unsigned | NO   | MUL | NULL    |       |
+----------+------------------+------+-----+---------+-------+

mysql> describe childs;
+---------+------------------+------+-----+---------+-------+
| Field   | Type             | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| childid | int(10) unsigned | NO   | MUL | NULL    |       |
+---------+------------------+------+-----+---------+-------+
ALTER TABLE `childs` ADD CONSTRAINT `childs_ibfk_1` FOREIGN KEY (`childid`)
REFERENCES `parents` (`parentid`);

Я создал триггер для дочерней таблицы вида:

DELIMITER //
DROP TRIGGER IF EXISTS childs_afterdelete; //
CREATE TRIGGER childs_afterdelete
AFTER DELETE ON childs
FOR EACH ROW
BEGIN
    DELETE FROM parents
        USING parents
        JOIN (
            SELECT childs.childid
            FROM   childs
                   JOIN childs AS c
                     ON c.childid = OLD.childid
            WHERE  childs.childid = c.childid
            GROUP  BY childs.childid
            HAVING COUNT(*) = 1
        ) c ON parents.parentid = c.childid;
END; //
DELIMITER ;

Но при удалении записей из дочерней таблицы я получаю сообщения об ошибках:

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`test`.`childs`, CONSTRAINT `childs_ibfk_1` FOREIGN KEY (`childid`) REFERENCES `parents` (`parentid`))

Собственно, вопрос о том, действительно ли нельзя таким образом как я делаю подтереть родительскую таблицу? Что примечательно, согласно запросу я пытаюсь удалять только те записи родительской таблицы, которые более не используются в дочерней таблице childs, соответственно не ожидал подобного рода ошибок.

Условие же AFTER DELETE в триггере дополнительно вселяло в меня надежду, что задуманное удаление данных из родительской таблицы должно работать, ибо оно должно быть выполнено ПОСЛЕ УДАЛЕНИЯ из дочерней таблицы.

Отредактированно FiMko (15.10.2011 12:30:00)

Неактивен

 

#2 15.10.2011 12:27:07

FiMko
Активист
Откуда: Санкт-Петербург
Зарегистрирован: 18.09.2009
Сообщений: 198

Re: AFTER DELETE триггер на дочернюю таблицу для удаления в родительской

Решил вот таким образом:

DELIMITER //
DROP TRIGGER IF EXISTS childs_afterdelete; //
CREATE TRIGGER childs_afterdelete
AFTER DELETE ON childs
FOR EACH ROW
BEGIN
    DECLARE dependentnum INT UNSIGNED;

    SELECT COUNT(*)
    INTO   dependentnum
    FROM   childs
    WHERE  childid = OLD.childid;
   
    IF dependentnum = 0 THEN
        DELETE FROM parents
        WHERE  parentid = OLD.childid;
    END IF;
END; //
DELIMITER ;
 

Отредактированно FiMko (15.10.2011 12:35:50)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson