ChatGPT解决这个技术问题 Extra ChatGPT

在 Postgresql 中,对两列的组合强制唯一

我想在 PostgreSQL 中设置一个表,这样两列必须是唯一的。任何一个值都可以有多个值,只要没有两个共享两者。

例如:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

因此,col1col2 可以重复,但不能同时重复。所以,这将是允许的(不包括 id)

1 1
1 2
2 1
2 2

但不是这个:

1 1
1 2
1 1 -- would reject this insert for violating constraints
由于这是 google 中排名靠前的搜索结果,也许最好也提供 alter exists 表

S
S.R
CREATE TABLE someTable (
    id serial PRIMARY KEY,
    col1 int NOT NULL,
    col2 int NOT NULL,
    UNIQUE (col1, col2)
)

autoincrement 不是 postgresql。您需要一个 integer primary key generated always as identity(或 serial,如果您使用 PG 9 或更低版本。serial was soft-deprecated in PG 10)。

如果 col1col2 是唯一的并且不能为空,那么它们是一个很好的主键:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    PRIMARY KEY (col1, col2)
)

我喜欢这里主键而不是唯一键的建议,因为在这种情况下我们不允许 NULL 值。来自 PostgeSQL 文档:“请注意,唯一约束本身并不提供唯一标识符,因为它不排除空值。)”postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
如何在架构定义中实现这一点?
在某些情况下,您可能希望将代理键用作主键,而不是列的组合。特别是在对大数据卷进行连接时提高性能。我个人选择了下面的 UNIQUE CONSTRAINT 解决方案。
是否可以仅对一个排列强制执行唯一约束,例如 unique(col1, col2 = '1')?
P
PearsonArtPhoto

创建两个数字不能一起重复的唯一约束:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

T
Timur Sadykov

似乎是常规的 UNIQUE CONSTRAINT :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

更多here


这是否会独立添加 a 的索引和 c 的索引?因为我有时需要根据a快速查找,有时需要根据c快速查找。
@CMCDragonkai a,c 上的此索引在内部用于两种类型的查询。将 'a' 作为 where 子句的查询以及 where 子句中存在列 a 和 c 的查询将从上述索引中受益。在这两种方式中,列“a”都应该存在,因为它是查找列。
T
Tay Hess

如果像我一样,你来到这里:

预先存在的表,

您需要向其中添加新列,以及

还需要在新列和旧列上添加新的唯一约束,并且

能够撤消这一切(即写下迁移)

这对我有用,利用上述答案之一并扩展它:

-- up

ALTER TABLE myoldtable ADD COLUMN newcolumn TEXT;
ALTER TABLE myoldtable ADD CONSTRAINT myoldtable_oldcolumn_newcolumn_key UNIQUE (oldcolumn, newcolumn);

---

ALTER TABLE myoldtable DROP CONSTRAINT myoldtable_oldcolumn_newcolumn_key;
ALTER TABLE myoldtable DROP COLUMN newcolumn;

-- down