###前提・実現したいこと
データが既に存在していないかチェックし、
存在していない場合、そのテーブルのIDの最大値に1足した値で登録したい。
###発生している問題・エラーメッセージ
特定のデータが既に存在しているかチェックし、
その値がない場合だけテーブルを更新したいと思います。
その時、更新するのにIDの値をチェックして自動で入力したいと思います。
SERIAL型を使えば解決する気もするのですが、
もしSERIAL型を使わなくても良い方法があればご教授ください。
###該当のソースコード
以下のサイトを参考にソースコードを作りました。
サイトではUPDATEまで言及していましたが、
UPDATEに関しては今回は必要ありません。
http://skworkspace.net/archives/170
Table f id | value 1 | 100 2 | 51 3 | 23 ・ ・ ・
例えば、30という数値がテーブルに保存されていない場合登録したいとします。
上記のサイトを参考に以下のSQL文を最初に考えましたが、fを参照できていないのでエラーがでます。
INSERT INTO f (id, value) SELECT max(id + 1), 30 WHERE NOT EXISTS (SELECT 1 FROM f WHERE value=30);
そこで以下のようにfを参照するようにしました。
INSERT INTO f (id, value) SELECT max(id + 1), 30 FROM f WHERE NOT EXISTS (SELECT 1 FROM f WHERE value=30);
すると無事にINSERTされるようになりましたが、
本来はvalueが30のデータがある場合はINSERTしてほしくないのに、INSERTされてしまいます。
しかもidの値はない状態でINSERTされています。
Table f id | value 1 | 100 2 | 51 3 | 23 4 | 30 | 30
どうやらmax(id + 1)を加えたことが原因のようです。
SERIAL型にする以外の解決法があれば教えて下さい。
よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
PostgreSQL version 9.5.4
回答1件
あなたの回答
tips
プレビュー