postgres 中的两个外键

Ror*_*ach 3 sql postgresql ddl foreign-keys

我正在制作一个连接表。我希望它有 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,
);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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
Run Code Online (Sandbox Code Playgroud)

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)
);
Run Code Online (Sandbox Code Playgroud)

但遇到了非常相似的错误。

Mur*_*nik 7

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

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,
);
Run Code Online (Sandbox Code Playgroud)

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

  • 使用复数形式是个坏主意,尤其是当其余表格都是单数时。IMO 最好使用 `user_` 代替。 (2认同)