我有以下一组表格:
CREATE TABLE sellers (
id integer PRIMARY KEY,
....
);
CREATE TABLE buyers (
id integer PRIMARY KEY,
....
);
CREATE TABLE invoices (
id integer PRIMARY KEY,
number varchar(40),
buyer_id integer REFERENCES buyers(id),
seller_id integer REFERENCES sellers(id),
UNIQUE(seller_id, number),
....
);
UNIQUE 约束强制一个卖家只能有一张具有给定编号的发票。
我想创建一个新表,主要作为 buyers
和 sellers
之间的多对多关系:
CREATE TABLE suppliers (
id integer PRIMARY KEY,
buyer_id integer REFERENCES buyers(id),
seller_id integer REFERENCES sellers(id),
....
);
作为标准化工作,我想将 invoices
更改为引用 suppliers
,如下所示:
CREATE TABLE invoices (
id integer PRIMARY KEY,
number varchar(40),
supplier_id integer REFERENCES suppliers(id),
....
);
我的问题是:如何替换 UNIQUE 约束?
最佳答案
为供应商
使用复合主键:
CREATE TABLE suppliers (
buyer_id integer REFERENCES buyers(id),
seller_id integer REFERENCES sellers(id),
...
PRIMARY KEY (buyer_id, seller_id),
...
);
并保持 invoices
表完整,只是将两个外键更改为一个:
CREATE TABLE invoices (
id integer PRIMARY KEY,
number varchar(40),
buyer_id integer,
seller_id integer,
UNIQUE (seller_id, number),
FOREIGN KEY (buyer_id, seller_id)
REFERENCES suppliers (buyer_id, seller_id),
....
);
如果您计划在 suppliers
表中包含更多与 seller - buyer
关系相关的列,我想这种设计会很有用。否则,您可以拥有一个从 invoices
表收集数据的 View :
CREATE VIEW suppliers AS
SELECT DISTINCT buyer_id, seller_id
FROM invoices ;
关于sql - 间接 UNIQUE 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969779/