9

如果博客有一个“类别”表,如下所示:

CREATE TABLE categories
(
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  parent_id INTEGER NOT NULL,
  name VARCHAR(30) NOT NULL,
  description TEXT,
  count INTEGER NOT NULL DEFAULT 0
);

如果 parent_id 字段旨在引用类别表的“id”字段,那么我如何添加一个约束来确保插入到 parent_id 中的值引用 id 字段?

我只是想确保只有存在的类别 id 值可以用作新插入类别的父级。

4

3 回答 3

14

是的,您可以引用同一个表中的列。

但是该列应该可以为空,否则您无法插入第一条记录。

CREATE TABLE categories
(
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  parent_id INTEGER NULL,
  name VARCHAR(30) NOT NULL,
  description TEXT,
  count INTEGER NOT NULL DEFAULT 0,
  FOREIGN KEY (parent_id) REFERENCES categories(id)
);

请注意,在 REFERENCES 关键字之后,表名不是可选的,因此即使您引用同一个表中的列,也必须指定它。从文档中:

参考定义:
    参考 tbl_name (index_col_name,...)
      [匹配完整 | 比赛部分 | 匹配简单]
      [ON DELETE reference_option]
      [ON UPDATE reference_option]

在线查看它:sqlfiddle

于 2012-07-12T20:10:03.590 回答
2

只需使用普通的外键:

ALTER TABLE categories ADD CONSTRAINT FK_categories_Parent_ID 
REFERENCES categories (ID)

但是 Parent_ID 应该可以为空,因为您将永远无法插入记录

于 2012-07-12T20:12:04.027 回答
0

您可以使用以下链接。它有你如何做到的Oracle数据库。

http://www.adp-gmbh.ch/ora/data_samples/hierarchic_yahoo.html

谢谢

于 2012-07-12T20:12:31.777 回答