【问题标题】:Two foreign keys in postgrespostgres中的两个外键
【发布时间】:2015-08-06 21:39:32
【问题描述】:

我正在制作一个连接表。我希望它有 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)
);

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

【问题讨论】:

    标签: sql postgresql foreign-keys ddl


    【解决方案1】:

    两个、三个或一打外键都没有问题。 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),问题就会消失。

    【讨论】:

    • 使用复数形式是个坏主意,尤其是在其余表格为单数的情况下。 IMO 最好改用user_
    【解决方案2】:

    试试

    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,
    );
    

    反而……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 2011-12-04
      • 2022-01-24
      • 1970-01-01
      相关资源
      最近更新 更多