加入的 PostgreSQL UNIQUE table

PostgreSQL UNIQUE for JOINed table

给定以下示例:

CREATE TABLE bom (
    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    name varchar(255) NOT NULL
);

CREATE TABLE bom_item (
    id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    bom_id_fk INT REFERENCES bom(id) NOT NULL,
    pcb_identifier varchar(50) NOT NULL
)

是否可以在 bom_item.pcb_identifier 上对某个 bom_id_fk 施加 UNIQUE 约束,而不是让它们都成为 PRIMARY KEY
这背后的逻辑是,pcb_identifier在某个BOM

中可能只存在一次

在 Postgres 中,您通常会为此使用 partial unique index

create unique index on bom_item(pcb_identifier) where(bom_id_fk = ?)

问号应替换为您要强制执行 pcb_identifier 唯一性的 bom_id_fk 的值。

是的,您想要一个具有两个键的唯一约束:

CREATE TABLE bom_item (
    id SERIAL PRIMARY KEY,
    bom_id_fk INTEGER REFERENCES bom(id) NOT NULL,
    pcb_identifier varchar(50) NOT NULL,
    CONSTRAINT unq_pcb_identifier_bom_id_fk UNIQUE (pcb_identifier, bom_id_fk)
);

这将保证每个 bom_id_fk 最多有一个 pcb_identifier。请注意,任何一个键都可以在 table 中多次出现。这是独一无二的一对。

顺便说一下,Postgres 建议将 serial 替换为 int generated always as identity