postgres中的两个外键

时间:2015-08-06 21:39:32

标签: sql postgresql foreign-keys ddl

我正在制作一个联结表。我希望它有2个独立的外键,引用2个独立表中的ID。

create table user_book (
    id serial primary key NOT NULL DEFAULT nextval('seq_user_prod_pk'::regclass),
    book_id numeric references books (id) NOT NULL,
    user_id numeric NOT NULL references user (id),
    checked bool,
);

我收到错误:

ERROR:  syntax error at or near "user"
LINE 4:     user_id numeric NOT NULL references user (id),
                                                ^

********** Error **********

ERROR: syntax error at or near "user"
SQL state: 42601
Character: 202

Postgres不允许来自两个独立表的2个外键吗?

我也尝试过:

create table user_book (
    id serial primary key NOT NULL DEFAULT nextval('seq_user_prod_pk'::regclass),
    book_id numeric NOT NULL,
    user_id numeric NOT NULL,
    checked bool,
    foreign key (book_id) references book (id)
    foreign key (user_id) references user (id)
);

但得到了一个非常相似的错误。

2 个答案:

答案 0 :(得分:2)

两个,三个或十几个外键没问题。 user是Postgres(以及IIRC中的ANSI SQL)中的保留字,因此不应将其用作表名。当然,您可以使用引号(")来逃避它:

create table user_book (
    id serial primary key NOT NULL DEFAULT nextval('seq_user_prod_pk'::regclass),
    book_id numeric references books (id) NOT NULL,
    user_id numeric NOT NULL references "user" (id), -- here
    checked bool,
);

但实际上,这只是一个糟糕的名字选择。将名称切换为非保留字(例如users),问题应该消失。

答案 1 :(得分:1)

尝试

create table user_book (
    id serial primary key NOT NULL DEFAULT nextval('seq_user_prod_pk'::regclass),
    book_id numeric references books (id) NOT NULL,
    user_id numeric NOT NULL references "user" (id),
    checked bool,
);

而不是......