sql - 间接 UNIQUE 约束

标签 sql postgresql

我有以下一组表格:

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 约束强制一个卖家只能有一张具有给定编号的发票。

我想创建一个新表,主要作为 buyerssellers 之间的多对多关系:

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/

相关文章:

php - 简单的 PHP 分页脚本

php - Laravel 查询 - Join 和 GroupBy

mysql - 我需要什么样的 JOIN 或 WHERE 子句?

java - 错误 : The column index is out of range: 1, 列数:0

sql - 通过 SQL 读取下一条/上一条记录

c# - 如何修改自动生成的 Entity Framework DbContext 属性?

sql - 使用一个更大的表或 OneToOne 关系?

django - 重置 Django 迁移 : relation "django_migrations" does not exist

json - PostgreSQL 9.3 : Adding new Fields to JSON Type

SQL GROUP BY 以及之后的某种重新减少