删除级联上的MySQL删除pk_id上的parent_id删除

时间:2016-04-01 21:27:10

标签: php mysql

我不想写一个php递归函数来处理它。

我有一个查找表,可以生成文章和类别的列表,每个文章和类别都有自己的唯一ID(nav_id),如果是孩子,则会有parent_id (然而,文章从未用作父母。)

所以我的想法是CASCADE DELETE,它一直运行违规,parent_id不能为null。然而,这就是我识别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

但INSERT结果为:

':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
)

  

完整性约束违规:1048列' parent_id'不能为空

欢迎任何和所有想法。

表结构变化?外键改变?

我还尝试在删除之前和之后触发,但是你不能从同一个表中删除执行触发器。

2 个答案:

答案 0 :(得分:0)

MySQL不允许您在null中插入parent_id值,因为它是主键的一部分。见下文:

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

您无法为主键列插入null值。如果从主键中删除parent_id,则插入将正常工作。这是 SQL Fiddle

答案 1 :(得分:0)

完整答案

第1部分

从Darshan Mehta创建SQL表以修复空插入限额

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