• ベストアンサー

AUTO_INCREMENTに0はダメ?

「INT」でかつ「AUTO_INCREMENT」のカラムに0をINSERTしようとするとうまくいかないのですが、 「AUTO_INCREMENT」では0はダメなのでしょうか? それとも「INT」だから?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 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がないのが不満だと思った時点で、値の絶対値そのものに興味があると言うことですよね。大概これは、危険な兆候です。

re97
質問者

お礼

回答ありがとうございました。 >値そのもの(または、値と値の関係)に興味がある場合には、そもそもauto_incrementは使うべきではないとされています。ちゃんと自分で決められた条件を満たすロジックを作成して発行するべきです ・違う構成のデータを引っ張ってこようとして、なおかつ、SQL理解不足もあり、結構混乱していました ・アドバイス大変参考になりましたー

その他の回答 (1)

回答No.1

MySQLのデフォルトの挙動では、 AUTO_INCREMENTが指定されているカラムに、 0 (もしくは NULL )の値が指定されると、 自動的に、そのカラムが持っている最大値に +1 した値が挿入されます。 これを回避するためには、 MySQLのSQLモードを NO_AUTO_VALUE_ON_ZERO に指定することで、回避することができます。 [設定コマンド] set global sql_mode='NO_AUTO_VALUE_ON_ZERO'; ただし、参考URLの NO_AUTO_VALUE_ON_ZERO の項目にも記述があるのですが、 AUTO_INCREMENTのカラムに 0 を保存することはあまり推奨されていないようです。 なので、「INT」だからダメということではなく、 「MEDIUMINT」や「SMALLINT」でも同様の挙動になるかと思います。

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html
re97
質問者

お礼

回答ありがとうございました。 >AUTO_INCREMENTのカラムに 0 を保存することはあまり推奨されていないようです ・アドバイスありがとうございました ・素直に 0 は保存しないよう、考え直したいと思います >「INT」だからダメということではなく、「MEDIUMINT」や「SMALLINT」でも同様の挙動になるかと思います ・良く分かりましたー

関連するQ&A