2017-05-03 485 views
0

H2(使用MODE = MYSQL打开)支持INSERT ON DUPLICATE KEY UPDATE语句仅与VALUES子句同时抛出“唯一索引或主键使用INSERT SELECT语句时出现“冲突”错误。H2 INSERT SELECT ON DUPLICATE KEY UPDATE抛出“唯一索引或主键违例”错误

下面是一个例子:

-- 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数据库版本1.4.192。 这是一个错误?或者我的代码有问题吗?

谢谢

+0

我没有使用MySql,我正在使用H2版本1.4.192(问题更新) – user1781028

回答

-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的错误,但是这并没有任何关系的表的主键。

+0

我不这么认为,我试着使用id INT NOT NULL,并且我得到了相同的结果。我要更新删除AUTOINCREMENT的问题 – user1781028

0

在您的H2控制台上,如果您有'HIBERNATE_SEQUENCES'表,请务必检查SEQUENCE_NAME = 'default'NEXT_VAL是什么。

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

相关问题