当尝试使用PostgreSQL执行UPSERT
时,我遇到了一个我不理解的行为。文档似乎指示INSERT
语句的冲突目标可以是索引表达式或约束名称。但是,当试图引用约束名称时,我得到了一个“列...不存在”错误。
我的第一次尝试是创建一个唯一的
索引,它可以很好地处理约束推理:
create table kv (key text, value text, extra text);
create unique index kv_key_value on kv(key, value);
insert into kv (key, value) values ('k1', 'v1');
-- this works:
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (key, value) do update set extra=excluded.extra;
-- this does not
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (kv_key_value) do update set extra=excluded.extra;
在描述上表时,我在“索引”下看到了以下内容:
"kv_key_value" UNIQUE, btree (key, value)
我的第二次尝试是将唯一约束显式地放在创建表中:
create table kv (
key text,
value text,
extra text,
constraint kv_key_value unique(key, value));
在描述上表时,“索引:”的输出略有不同(“唯一约束”与前一示例中的“唯一”):
"kv_key_value" UNIQUE CONSTRAINT, btree (key, value)
然而,我仍然无法将约束名称指定为冲突目标:
insert into kv (key, value, extra) values ('k1', 'v1', 'e1')
on conflict (kv_key_value) do update set extra=excluded.extra;
ERROR: column "kv_key_value" does not exist
LINE 2: on conflict (kv_key_value) do update set extra=exclude...
我误解了什么吗?我完全明白我可以使用等价表达式并依赖约束推理,但是我想知道为什么当文档让约束名称听起来像是应该的时候,它看起来不起作用?
你把语法搞错了。
对于约束,它应该是:
INSERT INTO kv (key, value, extra)
VALUES ('k1', 'v1', 'e1')
ON CONFLICT ON CONSTRAINT kv_key_value
DO UPDATE SET extra = excluded.extra;
问题内容: 我正在将SEAM 2 / Hibernate与PostgreSQL 9数据库一起使用。我有下表 我想添加一个约束,以确保每个新条目都具有active_band_user和active_band_date的唯一组合。 每秒可能有许多次尝试插入,因此我需要尽可能地提高效率,是否可以在实体映射中使用SEAM /hibernate注释? 提前致谢 问题答案: 没有Hibernate注释在插入/
我想添加一个约束,只在表的一部分中对列强制唯一性。 上面的部分是一厢情愿的想法。 有办法吗?还是应该回到关系绘图板?
我的桌子有两个独特的列: 我想写保存或更新方法 My jooq code: 但我遇到了异常: “错误:没有唯一或排除约束匹配ON CONFLICT规范” 请帮助。
问题内容: 给定Postgres数据库中的以下三列:第一,第二,第三;我如何创建一个约束使得排列是唯一的? 例如,如果数据库中存在,则将其作为非唯一变量排除在外。 问题答案: 您可以使用hstore创建唯一索引: 更新 实际上
以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。
问题内容: 我们有一个遗留数据库架构,该架构具有一些有趣的设计决策。直到最近,我们仅支持Oracle和SQL Server,但是我们试图添加对PostgreSQL的支持,这带来了一个有趣的问题。我已经搜索了Stack Overflow和Internet的其余部分,但我不认为这种特殊情况是重复的。 对于唯一约束中的可为空的列,Oracle和SQL Server的行为相同,这实际上是在执行唯一检查时忽