递归外键问题

时间:2011-12-12 23:07:17

标签: postgresql foreign-keys primary-key

在我的数据库设计中,我需要一个具有递归外键关系的表,即外键引用同一个表。当我尝试使用一列时,它可以正常工作,但是当我使用两列时,它会出错。下面是示例代码和产生的错误。我们将非常感谢您的帮助。

CREATE TABLE categories (
categoryID integer ,
parentID integer ,
setID integer REFERENCES categories(categoryID,parentID),
name char(255) NOT NULL,
PRIMARY KEY(categoryID,parentID)
);
  

错误:外键不同意的引用和引用列数

当我使用

setID integer REFERENCES categories(categoryID) and 
PRIMARY KEY(categoryID) 

然后它没有给出错误,但那不是我想要的。

2 个答案:

答案 0 :(得分:7)

你可能想要这个:

CREATE TABLE categories (
    categoryID integer,
    parentID integer,
    setID integer,
    name char(255) NOT NULL,
    PRIMARY KEY (categoryID, parentID),
    FOREIGN KEY (categoryID, parentID) REFERENCES categories(categoryID, parentID)
);

咨询manual about the syntax

在评论中回答跟进问题:

CREATE TABLE categories (
    categoryID integer,
    parentID integer,
    setID integer,
    name char(255) NOT NULL,
    PRIMARY KEY (categoryID, parentID),
    UNIQUE (setID, parentID) 
    FOREIGN KEY (setID, parentID) REFERENCES categories(setID, parentID)
);

外键的目标需要某种唯一性约束。我引用manual

  

引用的列必须是不可延迟的唯一列   或引用表中的主键约束。

答案 1 :(得分:3)

是的,不幸的是,你试图说一个数字字段应该相当于两个数字字段。不会真的发生。

考虑一下你对SetID的使用。你真的需要吗?

相反,请确保parentID是categoryID的外键(即表示parentID的任何值都作为parentID中的对应和现有值存在)。