微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

POSTGRES-使用ON CONFLICT防止序列递增不要这样做

如何解决POSTGRES-使用ON CONFLICT防止序列递增不要这样做

使用insert ... on conflict,您不能阻止serial冲突自动增加。Postgres(就像其他数据库一样)不保证序列是连续的,如文档中所述

因为smallserialserial并且bigserial使用序列实现时,可能有值的,其出现在列,即使没有行被彻底删除序列中的“洞”或间隙。即使从未成功将包含该值的行插入表列,也仍会“用完”从序列中分配的值。例如,如果插入事务回滚,则可能会发生这种情况。

如果您正在运行大量insert最终导致冲突的方法,则可以限制语法要求的一种方法是将语法更改为not exists

insert into things (name)
select name
from (values ('desk')) v(name)
where not exists (select 1 from things t1 where t1.name = v.name)

请注意,这仍然不能保证序列将是连续的(请参考文档中的以上引用)。

解决方法

说我有下表的东西。我想要表中的唯一名称,所以没有重复的名称。 插入事物的过程无需检查是否已存在具有该名称的事物。

CREATE TABLE things(
    id SMALLSERIAL PRIMARY KEY,name varchar UNIQUE
);

当我插入这样的值时,它可以工作。如果“办公桌”已经在东西中,则不会插入。

INSERT INTO things (name)
VALUES ('desk')
ON CONFLICT DO NOTHING;

唯一的问题是“冲突”,“什么都不做”并不能真正无所作为。仍然会增加id字段的顺序。

如果这种情况经常发生,则ID序列对于字段类型最终会变得太大。

有办法防止这种情况发生吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。