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版。 这是一个错误吗?或者我的代码有问题吗?
谢谢
答案 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
,但这与表中的主键无关。