Postgres:允许使用嵌套外键吗?

时间:2009-08-21 02:27:05

标签: postgresql foreign-keys

我的意思是:

FK1 -> 1FK2 -> 2PK

请注意,1FK2是FK1的PK,但1FK2是FK到2PK。所以嵌套结构中的关键是FK和PK。

一个例子:

--- Like an interface
CREATE TABLE q_content (
user_id SERIAL PRIMARY KEY, ---);

---- tables that refer to it
CREATE TABLE questions (
user_id SERIAL 
    references q_content(user_id) ---);

CREATE TABLE removed_questions (
user_id SERIAL
    references questions(user_id) ---);

3 个答案:

答案 0 :(得分:3)

是的,列可以是其表的主键,也可以是父表的外键。

但是,在这种情况下,您无需使用SERIAL作为questions.user_idremoved_questions.user_id的数据类型。 SERIAL数据类型隐式创建一个新的序列对象,您不需要它,因为这些主键必须只包含它们引用的表中已存在的值。

这也与您的问题相关,但我根本不会定义removed_questions表。这应该是questions表中的属性列。

答案 1 :(得分:1)

当你尝试使用自然键或大多数自然键时,它很常见 - 子对象的表通常具有“包含”其父键的主键的主键。要扩展您的示例,您可能有:

CREATE TABLE questions
(
    user_id INTEGER REFERENCES q_content(user_id),
    topic TEXT,

    PRIMARY KEY (used_id, topic)
);

-- CREATE TABLE removed_questions (that has the same primary key as questions, which is also a foreign key to questions's primary).

我已经在这里将user_id更改为INTEGER,因为当它应该与q_content表中的值相对应时,通常不希望从空中生成它。< / p>

答案 2 :(得分:0)

是的,这是完全合法的,事实上可能相当普遍。

相关问题