2016-04-01 4 views
0

Я не хочу писать рекурсивную функцию php для ее обработки.MySQL on delete cascade remove parent_id on pk_id remove

У меня есть таблица поиска, которая генерирует список статей и категорий, каждый из которых имеет свой собственный уникальный идентификатор (nav_id), и если это дочерний элемент, он имеет parent_id (статьи никогда не используются в качестве родителя).

Так что мои мысли были CASCADE DELETE, которые продолжают работать в нарушении parent_id не могут быть пустыми. Однако именно так я определяю root.

SQL

CREATE TABLE IF NOT EXISTS `navigation` (
`nav_id` INT NOT NULL AUTO_INCREMENT COMMENT '', 
`parent_id` INT NULL COMMENT '', 
`article_id` INT NULL DEFAULT 0 COMMENT '', 
`category_id` INT NULL DEFAULT 0 COMMENT '', 
`position` TINYINT NULL COMMENT '', 
PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '', 
UNIQUE INDEX `nav_id_UNIQUE` (`nav_id` ASC) COMMENT '', 
INDEX `rec1_idx` (`parent_id` ASC) COMMENT '', 
CONSTRAINT `rec1` 
FOREIGN KEY (`parent_id`) 
REFERENCES `navigation` (`nav_id`) 
ON DELETE CASCADE 
ON UPDATE NO ACTION) 
ENGINE = InnoDB 

Однако ВСТАВИТЬ результат для:

':parent_id' => null 
':article_id' => null 
':category_id' => 19 
':position' => 1 


INSERT INTO navigation (
parent_id,article_id,category_id,position 
) VALUES (
:parent_id,:article_id,:category_id,:position 
) 

является

Integrity constraint violation: 1048 Column 'parent_id' cannot be null

Любые идеи приветствуются.

Таблица структурных изменений? Изменение внешнего ключа?

Я также попробовал триггер после и перед удалением, однако вы не можете удалить из той же таблицы, на которой запускается триггер.

+0

Смотрите, если это помогает: HTTP: //stackoverflow.com/questions/441988/mysql-foreign-key-to-allow-null – Maximus2012

+0

Другой: http://stackoverflow.com/questions/150828 74/how-to-pass-a-null-value-to-a-foreign-key-field – Maximus2012

+0

Нет. Либо несколько таблиц, либо у них проблема с первичным ключом. Я даже изменил свой CREATE TABLE SQL DEFAULT parent_id = null и установил его в поле галочки PHPMyAdmin null, то же самое.Хорошо работает, если я удаляю ограничение, но мне нужно, чтобы каскад delete был удален. – Darcey

ответ

0

MySQL не позволяет вам вставлять null значение в parent_id, потому что это часть первичного ключа. Смотрите ниже:

PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '' 

Вы не можете вставить null значения для столбцов первичного ключа. Если вы удалите parent_id из первичного ключа, вставка будет работать нормально. Вот SQL Fiddle.

+0

Ах, ха! Это привело к тому, что вставка исправлена ​​... – Darcey

+0

Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа завершается с ошибкой ('navigation', CONSTRAINT' rec1' FOREIGN KEY ('parent_id'). ССЫЛКИ' navigation' ('nav_id')) 'in – Darcey

+0

PS. Nice Я не знал, что SQLFiddle существует :) Теперь я googling ошибка внешнего ключа. – Darcey

0

ПОЛНЫЙ ОТВЕТ

ЧАСТЬ 1

ОТ Даршан Мехта на создание таблицы SQL, чтобы исправить Null УЧЕТОМ вставить

MySQL не позволяет вставить нулевое значение в parent_id, потому что это часть первичного ключа. Смотрите ниже:

PRIMARY KEY (`nav_id`, `parent_id`) COMMENT '' 

ЧАСТЬ 2

Основной вопрос, "CASCADE DELETE" следующий SQL работает отлично:

CREATE TABLE IF NOT EXISTS `navigation` (
`nav_id` INT NOT NULL AUTO_INCREMENT COMMENT '', 
`parent_id` INT NULL COMMENT '', 
`article_id` INT NULL DEFAULT 0 COMMENT '', 
`category_id` INT NULL DEFAULT 0 COMMENT '', 
`position` TINYINT NULL COMMENT '', 
PRIMARY KEY (`nav_id`) COMMENT '', 
UNIQUE INDEX `nav_id_UNIQUE` (`nav_id` ASC) COMMENT '', 
INDEX `rec1_idx` (`parent_id` ASC) COMMENT '', 
CONSTRAINT `rec1` 
FOREIGN KEY (`parent_id`) 
REFERENCES `navigation` (`nav_id`) 
ON DELETE CASCADE 
ON UPDATE NO ACTION 
); 

http://sqlfiddle.com/#!9/5026ee/1/0