Postgresql 如何创建此外键?-博士后

Postgresql 如何创建此外键?-博士后,postgresql,Postgresql,我有两张桌子。我正在尝试创建一个外键。这是我的第一张桌子: CREATE TABLE bills( id serial, name varchar(100), payment decimal(12, 2), payoff decimal(12, 2), type varchar(25) ) 当我尝试创建第二个表时: CREATE TABLE pay_dates( id serial, bill_id integer REFERENCES bills(id), due

我有两张桌子。我正在尝试创建一个
外键
。这是我的第一张桌子:

CREATE TABLE bills(
 id   serial,
 name  varchar(100),
 payment  decimal(12, 2),
 payoff  decimal(12, 2),
 type  varchar(25)
)
当我尝试创建第二个表时:

CREATE TABLE pay_dates(
 id serial,
 bill_id integer REFERENCES bills(id),
 due_date date,
 pay_date date,
 paid  boolean
)
我得到这个错误:

错误:没有唯一约束匹配引用表“bills”的给定键。


我做错了什么?

引用的列必须是唯一的。您应该将id声明为主键:

CREATE TABLE bills(
 id   serial primary key,
...
主键(或唯一)约束必须声明为显式。类型serial仅确保默认值是序列中的下一个值。例如:

create table test (val1 serial, val2 serial);
insert into test (val2) values (1), (2), (default), (3), (4), (default);
select * from test;

 val1 | val2
------+------
    1 |    1
    2 |    2
    3 |    1
    4 |    3
    5 |    4
    6 |    2
(6 rows)
父表账单(id)必须具有唯一或主键约束


@jhamm No,
串行
并不意味着唯一。它的意思是:“请在我的数据库中创建一个
序列
对象,并使用该序列中的数字作为该表新行中的默认值”。请仔细阅读扩展的SQL。将列标记为
UNIQUE
(或
PRIMARY KEY
)表示“请在此列上创建一个索引,并使用该索引始终检查新的或修改的行在此列中的其他行上是否没有已存储的重复值”。串行和唯一/主键执行不同的任务。