2016-02-07 7 views
0

Таким образом, я получаю: КодMySql «не может обновить родительскую строку», когда у меня есть «ON UPDATE CASCADE»

Ошибки: 1451. Не удается удалить или обновить родительскую строку: внешний ключ ограничения не удается (playground. Person, скованность sk_Person_Parent FOREIGN KEY (parent_id) СПРАВОЧНЫЙ Person (id) ON DELETE CASCADE ON UPDATE CASCADE)

Это простая таблица, повторно сам по себе:

CREATE TABLE IF NOT EXISTS Person (
id int not null primary key, 
name varchar(100) not null, 
parent_id int null, 
CONSTRAINT `sk_Person_Parent` 
    FOREIGN KEY (parent_id) 
    REFERENCES Person (id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE 
); 

, как вы видите, есть «ПО ОБНОВЛЕНИЮ КАСКАД». вставить 4 простых строк в нем:

INSERT INTO Person(id, name, parent_id) 
VALUES 
(1, 'vasko', NULL), 
(2, 'asdas', 1), 
(3, 'ivo', 1), 
(4, 'anton', 3); 

так что у меня 1 - Vasko 2 - Asdasd 3 - IVO 4 - Антоном. Когда я удаляю по id 1, все записи удаляются из-за ВКЛЮЧЕНА УДАЛИТЬ КАСКАД. Однако, если я попытаюсь выполнить

UPDATE Person 
SET id=10 
WHERE id=1; 

Я получаю данную ошибку. Есть идеи?

(я ожидал идентификатор Васил, чтобы стать 10, а parent_id из следующих 2 рядов, которые будут обновлены до 10)

+0

Это интересный внешний ключ подход. Проблема заключается в том, что при попытке изменить идентификатор, что обычно не является обычным делом, но, скажем так, это нормально, сначала ** пытается изменить внешний ключ - поскольку id = 10 еще не существует, он терпит неудачу. Просто я не вижу обходного пути, чтобы решить его легко и любопытно, чтобы увидеть, есть ли (за исключением использования временного подхода к таблице). – smozgur

+0

хорошо я читал книгу db, и там была тема об иерархиях, поэтому я хотел поэкспериментировать, и тогда это подошло мне на ум. Не проблема, которая имеет решающее значение для моей работы над проектом, просто интересно. –

+0

ON UPDATE CASCADE выглядит бесполезным в этой структуре. Мне пришлось бы управлять им вручную для сделанных записей. Как я уже сказал, мне действительно интересно узнать, есть ли способ обхода проблемы. – smozgur

ответ

2

Это ограничение в Mysql:

Если ON UPDATE CASCADE или ON UPDATE SET NULL рекурсирует для обновления той же таблицы, которую она ранее обновляла во время каскада, она действует как RESTRICT. Это означает, что вы не можете использовать self-referential ON UPDATE CASCADE или ON UPDATE SET NULL.

ссылка here

+0

Спасибо, вы сказали, что это ограничение в Mysql. Знаете ли вы о каких-либо СУБД, что это будет работать? –

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

  • Нет связанных вопросов^_^