🔎

duplicate key value violates unique constraintをねじ伏せる(失敗学)

2023/09/06に公開

その席は塞がっています

FlutterでFrontSideを改良し、Severpodでendpointを再設定し、
少しでも使いやすいDatabaseができるよう、日々努力しているのだが、
突然、変なエラーが出る。
「そのIdは既に存在しています」
なんだそれ。
ログを見ると、新しいデータをId23に追加しようとている。
けれども、データは既に30まで埋まっている。
31に入れてほしいんですけどねえ。

Idはauto incrementじゃなかったのかい

と文句をつけて、ふと気づく。
あ、手動でデータを足したんだった。
それが認識されてない?
どうやら、ときどき起こるErrorらしく、記事もそれなりにある。
例えば
https://qiita.com/SNobu/items/2c97cb264c21a45c65bf

SQL叩いてもイマイチ?

そもそもPostgreSQLのGUIであるPostico2で、SQLを自発的に叩いたことがない。
table設定の時に、Serverpodが生成するSQLを貼り付ける、ぐらいしか出番がなかった。
ともかく、それと同じ要領で「最大Idを取得」と打ってはみたものの、
table作るのと違って、ぱっと結果が見えない。
しかも、どうも、うまくいってなさそう・・・。

おや、これは・・・

そうこうしているうちに、ふと気がついた。
さっき、23はもうあります、といっていたのに、27はもうあります、に変わっている。
なので、直ってないとわかっていながら、同じことを繰り返したら
28はもうあります、になったではないか。

ということはですよ。

こういう強引な手でいいんだろうか

そうです、つまり、あと2回失敗すれば、30に追いつくはずです。
そしてもう一回やれば

はい、ぶじINSERTできましたよ〜。

教訓 データを手動で登録するとき、Idを指定してはいけない

MySQLはでは起きなかったErrorです。
MySQLはテーブルに何件データが入っているかを見ているのに対して、
PostgreSQLは、「自分が」何件入力したか、を見ているらしいんですよね。
勝手に入れたヤツのことは知らん、という、頑固な職人です。

PostgreSQLは「自分の仕事に責任を持っている」ということにしておきましょう。

Flutter大学

Discussion