0

我有下表:

Create Table if not exists Categories(
    category_id int (10) primary key NOT NULL AUTO_INCREMENT,
    category_name varchar (20) NOT NULL,
    parent_category_id int (10) NOT NULL,   
    FOREIGN KEY (parent_category_id) REFERENCES Categories(category_id) ON DELETE CASCADE)

该表包含我网站上的每个类别 - 每个类别都有一个父类别(例如“计算机”是“编程”的父类别)我有几个没有任何父类别的顶级类别 => parent_category_id = 0

我的问题是如何插入顶级类别的数据。当我尝试这样做时:

INSERT INTO  `databaseproject`.`categories` (`category_id` ,`category_name` ,`parent_category_id`)
VALUES (NULL ,  'computers',  '0')

我收到错误:

#1452 - Cannot add or update a child row: a foreign key constraint fails (`databaseproject`.`categories`, CONSTRAINT `categories_ibfk_1` 
FOREIGN KEY (`parent_category_id`) REFERENCES `categories` (`category_id`) ON DELETE CASCADE) 

我该怎么做才能插入这些类别?

4

2 回答 2

2

使 parent_category_id 可以为空,并且父类别的 parent_category_id 为空,或者添加一个 id 为 0 的根行。

于 2013-05-03T18:31:29.917 回答
0

你有两个问题。首先,category_id 是一个 auto_increment 字段,这意味着当您插入新行时,数据库会为您创建一个值,因此您不需要提供它。您当然不能将其设置为 null,因为您明确表示它不能为 null,这绝对是您想要的自动递增 id 字段。只需将您的插入更改为:

INSERT INTO  'databaseproject'.'categories' ('category_name' ,'parent_category_id')
VALUES ('computers',  '0')

但是你还有另一个问题。由于您创建的约束,parent_category_id 必须引用类别表中的有效记录。您可以通过允许该字段为空(在创建 parent_category_id 时去掉“NOT NULL”)并使用空而不是零来表示这是顶级记录来解决此问题。

于 2013-05-03T18:50:32.587 回答