2017-09-30 12 views
0

次のように私はH2 DBに私のテーブルスキーマを持っている:テスト(nullでないIDのBIGINT、名前のVARCHAR(255)、主キー(id)を)が存在しない場合は同じテーブルから選択して挿入しない場合はどうすればいいですか?

は、テーブルを作成します。

alter tableテストが存在しない場合は制約を追加しますTest_NAME UNIQUE(name);

テーブルから最新のid値を選択して1つずつインクリメントしてテーブルに存在しない場合、name属性の値を 'Default'として挿入します。

例: name = Defaultのエントリがすでに存在する場合は挿入しないでください。

ID |名前

1 |デフォルト

name = Defaultのエントリが存在しない場合は、挿入します。

ID |名前

1 | ABC

2 | XYZ

idカラムの場合は、最大IDを見つけて1ずつ増やします。この場合、id = 3およびname = Defaultを挿入します。

次のように私のクエリは次のとおりです。

INSERT INTOテスト(ID、名前) SELECT MAX(ID)+ 1、EXISTS、NOTテスト (から 'デフォルト' は名前=」テスト* FROMを選択デフォルト');

しかし、それは私にエラーメッセージを表示します。 カラム "ID"にはNULLを使用できません。 SQLステートメント は、内部selectステートメントのwhere条件を適用するので、

私も試しました: MERGE INTOテストKEY(name)VALUES(SELECTからMAX、(ID)+ 1を選択、 'Default');

これは、mergeが新しい値で更新しようとするため、エラーが発生します。 'Default'が見つかると、主キー違反の原因となる新しいIDで行を更新します。

これを行うより良い方法はありますか?クエリを機能させるにはどうすればよいですか?

ありがとうございました。

答えて

2

これは大規模に複雑化しています。 idフィールドをauto incrementと定義し、nameフィールドに一意のインデックスを配置します。一意のインデックスは重複する名前の挿入を防ぎますが、自動インクリメントは、挿入が成功した場合にidフィールドの値を1(デフォルト)増加させます。

0

I自動インクリメントに更新idと、次の問合せ作業完璧

INSERT INTOテスト(名前)を選択*テストから名前を選択(EXISTS、NOT tmpなど(「デフォルト」を選択します)どこから名= 'デフォルト');

関連する問題