Mysqlでは、DUPULICATE KEY UPDATEという便利なオプションがある。
これは、INSERTしようとして、制約違反つまりINSERTできない場合は、指定したカラムをUPDATEするというもの。
ただ、主キーにAutoIncrement属性が付いている場合、DUPULICATE KEY UPDATEが発行されるたびに、そのキーがインクリメントされてしまう。
というのは、INSERTできない場合のUPDATE処理に進んだ場合でも、インクリメントされてしまい、いくらかした後にINSERTされた場合に、その間のIDが欠番になってしまう。
とても不格好になってしまうというのと、Intである場合、予期せずにMaxに到達してしまうという危険性がある。
対応方法としては、次のようなことが挙げられる。
・主キーをBigintにする
・単純に連番である必要がない場合は無視する
・UPULICATE KEY UPDATEを使わずに、プログラム上でINSERTとUPDATEを分岐するようにする
・AutoIncremnt制約をつけづにIDを指定する
・主キー(IDカラム)が不要なら消してしまう