首页 文章

H2 INSERT SELECT ON DUPLICATE KEY UPDATE抛出“唯一索引或主键冲突”错误

提问于
浏览
1

H2(以MODE = MYSQL开启)仅支持使用VALUES子句的INSERT ON DUPLICATE KEY UPDATE语句,而在使用INSERT SELECT语句时会抛出“唯一索引或主键冲突”错误 .

这是一个例子:

-- creating a simple table
CREATE TABLE test_table1 (
  id INT NOT NULL,
  value VARCHAR(255) NOT NULL,
  PRIMARY KEY (id))
ENGINE = InnoDB;

-- inserting a value
INSERT INTO test_table1
VALUES (1, 'test1');

-- trying to insert on duplicate key update: it works!
INSERT INTO test_table1
VALUES (1, 'test2')
ON DUPLICATE KEY UPDATE value='test2';

-- trying using INSERT SELECT: it throws Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.TEST_TABLE1(ID)"
INSERT INTO test_table1
SELECT 1, 'test2'
FROM test_table1
ON DUPLICATE KEY UPDATE value='test2';

我正在使用H2 db版本1.4.192 . 这是一个错误吗?或者我的代码有问题吗?

谢谢

2 回答

  • -1

    在H2控制台上,如果你有'HIBERNATE_SEQUENCES'表,请确保检查 NEXT_VALNEXT_VAL 是什么 .

    在我的情况下,我的/src/main/resources/data.sql中有2行(插入语句), NEXT_VAL 是2,这导致了问题 . 我用update语句更改为3,现在工作正常 .

  • 0

    我的代码有问题吗?

    就在这里 . 为什么要插入自动增量列?您应该使用非自动生成的数据指定列 . 所以:

    INSERT INTO test_table1(value)
        VALUES ('test1');
    

    和:

    INSERT INTO test_table1(value)
        SELECT 'test2'
        FROM test_table1
        ON DUPLICATE KEY UPDATE value = VALUES(value);
    

    您收到错误是因为 ON DUPLICATE KEY 重置 value ,但这与表上的主键无关 .

相关问题