質問: auto_incrementに0はダメ? 「int」でかつ「auto_increment」のカラムに0をinsertしようとするとうまくいかないのですが、 「auto_increment」では0はダメなのでしょうか? それとも「int」だから?
回答: auto_incremnt属性の付いたカラムの基本的な性質のため、普通は0を使えません。 というのも、auto_increment属性のカラムは、そのカラムに、0かnullをインサートしようとした時に、自動採番した数値をカラムに代入するからです。 カラムの値に0を許すと、自動採番の引き金になる0なのか、数値としての0なのかをmysqlが判断することが出来なくなります。 sqlモード変数で、no_auto_value_on_zeroモードを有効にすると、この挙動が少しだけ変わり、nullをインサートしようとした時のみ自動採番するようになります。この場合は、0もデータとして利用できるようになります。 が・・・・ そもそも、この質問が出る時点で、auto_incrementの使い方が間違った方向に行ってる気配を感じます。 auto_incrementは、値の数字そのものには全く興味が無いがとりあえず、重複しない値が欲しいという時に使います。自動採番された数字は、連続しているとは「限らない」し、採番する時まで、どんな値になるかも不明です。 例えば、ある決まった値から、連続したシーケンス番号を発行したい・・・と言う時には、使ってはいけません。欠番が発生する可能性があるからです。例えば、トランザクションaとbが同時に実行され、aがインサートした後で、bがインサートを行い、その後、aがロールバックされたら、aの為に発行された数字は、欠番となります。 この連続が不可欠の例としては、伝票番号があげられます。もし欠番が見つかったら、それは、伝票が行方不明になったという意味であり、監査の時に大騒ぎになります。 このように、値そのもの(または、値と値の関係)に興味がある場合には、そもそもauto_incrementは使うべきではないとされています。ちゃんと自分で決められた条件を満たすロジックを作成して発行するべきです。 0がないのが不満だと思った時点で、値の絶対値そのものに興味があると言うことですよね。大概これは、危険な兆候です。