Нарушение внешнего ключа mysql на двух уровнях отношения многие-к-одному - PullRequest
0 голосов
/ 26 марта 2012

У меня есть 3 таблицы: ребенок, родитель и дедушка.У дочернего элемента есть столбец (parentId), указывающий на Parent (отношение «многие к одному»).Родитель имеет столбец (grandParentId), указывающий на GrandParent (еще один «многие к одному»).Когда я вставляю в GrandParent и Parent, они оба работают.Однако, когда я вставляю в Child, происходит сбой с нарушением «ограничения внешнего ключа».

   create table Child (
        id bigint not null auto_increment unique,
        attr1 int,
        parentId bigint not null,
        primary key (id)
    );

    create table Parent (
        id bigint not null auto_increment unique,
        attr1 int,
        grandParentId bigint not null,
        primary key (id)
    );
    create table GrandParent (
        id bigint not null auto_increment unique,
        attr1 int,
        primary key (id)
    );

alter table Child 
        add constraint FK102016375B091 
        foreign key (parentId) 
        references Parent (id);

 alter table Parent 
        add constraint FKB99B04C56B478365 
        foreign key (grandParentId) 
        references GrandParent (id);


    insert into GrandParent(attr1) values(1);  # created GrandParent(id)=1 
    insert into Parent(attr1, grandParentId) values(2, 1); #created Parent(id=1)
    insert into Child(attr1, parentId) values(3, 1); #fails

И строки GrandParent, и Parent создаются с id = 1.Последний оператор завершается ошибкой со следующей ошибкой (t1 - новая база данных).

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`t1`.`child`, CONSTRAINT `FK102016375B091` FOREIGN KEY (`parentId`) REFERENCES `Parent` (`id`))

Если я уберу ограничение родительских элементов в родительской таблице, 3-й оператор сработает.

Ваша помощь приветствуется!

1 Ответ

0 голосов
/ 26 марта 2012

Ваш сценарий правильный и работает на меня. Но перед вставкой проверьте параметр AUTO_INCREMENT для таблицы Parent. Это «1»?

Например, запустите оператор SHOW CREATE TABLE Parent;.

...