Ребята, привет всем!
Подскажите, пожалуйста, следующую вещь. 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)