加入的 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
。
给定以下示例:
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
。