java - Postgres 中多次插入序列失败

标签 java sql postgresql liquibase

有一个插入查询有多个值(大约18k):

INSERT INTO ENTRIES (ID, USER_ID) 
VALUES (nextval('my_seq'), '233'),(nextval('my_seq'), '233');

这是从 java 应用程序中的 liquibase 变更集触发的:

JdbcConnection connection = (JdbcConnection) database.getConnection();

        ResultSet resultSet = connection.prepareStatement("SELECT ID FROM USERS").executeQuery();

        List<String> values = new ArrayList<>();

        while (resultSet.next()) {
            Long userId = resultSet.getLong(1);

            for (int i = 0; i < 3; i++) {
                values.add("(nextval('my_seq'), '" + userId + "')");
            }
        }

        String sql = "INSERT INTO ENTRIES (ID, USER_ID) VALUES " + join(values, ",") + ";";

        connection.createStatement().execute(sql);

当它针对 h2 数据库执行时,一切都很好,但是当我针对 postgres 运行它时,会抛出以下异常:

duplicate key value violates unique constraint "entries_pkey"

就像序列中的 id 被重用一样。

当在 pgAdmin 中运行 sql 时一切正常,但从应用程序中它在第一次插入时失败。

我的第一个想法是也许 sql 应该以不同的方式执行。

对此有什么想法吗?

以下是表格说明:

  CREATE TABLE entries
(
  id bigint NOT NULL,
  user_id bigint,
  CONSTRAINT entries_pkey PRIMARY KEY (id),
  CONSTRAINT fk_e3udjwux3ly7lu31huish0f82 FOREIGN KEY (user_id)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE
);
ALTER TABLE entries
  OWNER TO app;

最佳答案

我的猜测是,您的序列计数器需要重置(也许您在表中手动输入了数字,而不是使用 nextval,因此计数器没有增加),并且它给出了表中已有的数字。尝试用类似的东西重置它<​​/p>

ALTER SEQUENCE my_seq RESTART 100000;

其中 100000 是大于以下的数字:

SELECT MAX(id) FROM entries;

关于java - Postgres 中多次插入序列失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28145184/

相关文章:

java - 路径更改时 getResourceAsStream 返回 null

sql - 自定义处理以在 SQL 中将行转换为列

MySQL正则表达式更新查询

sql - 记录 SQL 脚本错误

postgresql - 露天 Javamelody

postgresql - 在 PostgreSQL 中维护有序列表的最佳方法?

java - Spring Custom Validator - 使用参数插入消息

java JFrame setContentPanel 然后 JPanel 消失

java - MBean 和 MXBean 的区别

sql - 如何只显示sql结果中的日期