如何解决POSTGRES-使用ON CONFLICT DO NOTHING防止序列递增
说我有以下表格内容。我想要表中的唯一名称,所以没有重复。 插入事物的过程不需要检查是否已存在具有此名称的事物。
client-combined-3.141.59.jar
当我插入这样的值时,它起作用。如果“办公桌”已经在东西中,则不会插入。
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
唯一的问题是冲突,“什么都不做”实际上并没有做任何事情。仍然会增加id字段的顺序。
如果这种情况经常发生,则对于字段类型,id序列最终会变得太大。
有没有办法防止这种情况发生?
解决方法
使用insert ... on conflict
不能阻止serial
在冲突中自动增加。 Postgres(就像其他数据库一样)不保证序列是连续的,例如explained in the documentation:
由于
smallserial
,serial
和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)
请注意,这仍然不能保证序列将是连续的(请参阅文档中的以上引用)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。