【问题标题】:Is it possible to reference a different column in the same table?是否可以在同一个表中引用不同的列?
【发布时间】:2012-07-12 16:06:14
【问题描述】:

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

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 值可以用作新插入类别的父级。

【问题讨论】:

    标签: sql create-table hierarchical


    【解决方案1】:

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

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

    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 关键字之后,表名不是可选的,因此即使引用同一个表中的列,也必须指定它。来自documentation

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

    在线查看:sqlfiddle

    【讨论】:

    • 那么这是否意味着我应该这样做: parent_id INTEGER REFERENCES (id) ?
    • @JimJohnson:你需要指定表名。
    【解决方案2】:

    只需使用普通的外键:

    ALTER TABLE categories ADD CONSTRAINT FK_categories_Parent_ID 
    REFERENCES categories (ID)
    

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

    【讨论】:

    • 我从来不知道外键也可以是同一个表中的列>.
    • 我可以将 parent_id 默认为 0 吗?
    • @JimJohnson:你的表中有第 0 行吗?否则,如果您尝试添加 parent_id = 0 的行,您的外键约束将失败。但您可以改用 NULL。
    • @Mark Byers 我将只使用 NULL 代替:D
    【解决方案3】:

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

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

    谢谢

    【讨论】:

      猜你喜欢
      • 2021-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2021-02-08
      • 2020-07-03
      相关资源
      最近更新 更多