2017-05-03 18 views
0

H2(MODE = MYSQLで開始)は、INSERT ON DUPLICATE KEY UPDATEステートメントをVALUES句でのみサポートし、 "一意のインデックスまたは主キーINSERT SELECT文を使用すると「violation」エラーが発生します。ここで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のDBバージョン1.4.192を使用しています。 バグですか?または、私のコードに何か問題がありますか?

+0

私は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でNULLを試してみましたが、同じ結果が出ました。私は質問を更新するつもりですAUTOINCREMENT – user1781028

0

H2コンソールで、「HIBERNATE_SEQUENCES」テーブルをお持ちの場合はSEQUENCE_NAME = 'default'NEXT_VALを確認してください。

私の場合は、私の/src/main/resources/data.sqlに2行(insert文)があり、NEXT_VALは問題を引き起こしていました。私は更新ステートメントで3に変更され、今は正常に動作します。

関連する問題