H2 INSERT SELECT ON DUPLICATE KEY UPDATE抛出"唯一索引或主键违规"错误

时间:2017-05-03 12:41:44

标签: sql h2 on-duplicate-key

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 个答案:

答案 0 :(得分:0)

在H2控制台上,如果你有'HIBERNATE_SEQUENCES'表,请务必检查NEXT_VAL的{​​{1}}是什么。

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

答案 1 :(得分:-1)

  

我的代码有问题吗?

是的,有。为什么要插入自动增量列?您应该使用非自动生成的数据指定列。所以:

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,但这与表中的主键无关。