Mysql FK constraint fails: настройка связей для записи в дочернюю.

A_J

Новичок
Имеются 3 таблицы: events, events_objects, objects. Вторая из них дочерняя, объявляется с внешними ключами, остальные имеют связи с другими таблицами:
Код:
CREATE TABLE `events_objects` (
 `event_id` int(10) unsigned NOT NULL,
 `object_id` int(10) unsigned NOT NULL,
 KEY `user_objects_fk1` (`object_id`),
 KEY `event_id` (`event_id`,`object_id`),
 CONSTRAINT `user_objects_fk0` FOREIGN KEY (`event_id`) REFERENCES `sn_events` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `user_objects_fk1` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `objects` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `object_name` text NOT NULL,
 `object_create_date` datetime NOT NULL,
 `user_id` int(10) unsigned NOT NULL,
 PRIMARY KEY (`id`),
 KEY `fk_objects_users1_idx` (`user_id`),
 CONSTRAINT `fk_objects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `sn_events` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `applet_id` int(10) unsigned NOT NULL,
 `sn_user_id` int(10) unsigned NOT NULL,
 `status` tinyint(1) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `applet_id` (`applet_id`,`sn_user_id`),
 CONSTRAINT `sn_events_fk0` FOREIGN KEY (`applet_id`) REFERENCES `applets` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `sn_events_ibfk_1` FOREIGN KEY (`id`) REFERENCES `events_objects` (`event_id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
Добавляю значение в дочернюю:

Код:
INSERT INTO events_objects VALUES (event_id=29, object_id=25)
В родительских эти айдишники есть.

Ошибка:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`db`.`events_objects`, CONSTRAINT `user_objects_fk1` FOREIGN KEY (`object_id`) REFERENCES `objects` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
Как правильно должна задаваться таблица или как правильно нужно добавлять в такую таблицу данные?
 

WMix

герр M:)ller
Партнер клуба
судя по всему в objects нет записи с id=25
 

WMix

герр M:)ller
Партнер клуба
сделай срез данных в подтверждение твоих слов
 

A_J

Новичок
В подтверждение слов приведу запрос, который никак не может выдать #1452, если в таблицах нет нужных айдишников:
Код:
INSERT INTO events_objects VALUES (event_id=(SELECT id FROM events WHERE id=29), object_id=(SELECT id FROM objects WHERE id=25))
В частности,
Код:
select id from events where id=29
возвращает
и
Код:
select id from objects where id=25
возвращает
Можно также поставить кавычки везде где как бы положено, и убедиться в #1452.
Или можно перезадать таблицы без CONSTRAINT, и по первой инструкции из этого поста получить строчку с записью: 0, 0. А затем через
Код:
UPDATE events_objects SET event_id=29, object_id=25 WHERE event_id=0
получить требуемый результат, т.е. запись 29, 25.
Но так быть не должно, очевидно.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Код:
INSERT INTO events_objects VALUES (event_id=29, object_id=25)
В MySQL нет такого синтаксиса для insert. Точнее, он делает не то,что ты думаешь.
У тебя происходит примерно это:


Нужный тебе синтаксис:
SQL:
INSERT INTO events_objects (event_id, object_id) VALUES (29, 25)
 
Сверху