code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MySQL - NO_AUTO_VALUE_ON_ZERO

mysqldumpするとSQL_MODEを次のように変更しているのが分かる。

/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

日本語の解説だと、

NO_AUTO_VALUE_ON_ZEROAUTO_INCREMENT カラム処理に影響する。通常。次のシーケンス番号をカラムに生成するときには、NULL または 0 を挿入する。NO_AUTO_VALUE_ON_ZERO0 の動作を抑制するため、NULL が次のシーケンス番号を生成する。

・・・よく意味が分からなかった。英語の方を見ると、

NO_AUTO_VALUE_ON_ZERO affects handling of AUTO_INCREMENT columns. Normally, you generate the next sequence number for the column by inserting either NULL or 0 into it. NO_AUTO_VALUE_ON_ZERO suppresses this behavior for 0 so that only NULL generates the next sequence number.

つまりこのモードが有効の時は、AUTO_INCREMENTカラムに0を挿入するとそのまま0が入り、nullを指定した時だけ採番された新しい数字が入る。無効の時は、nullまたは0のどちらでも新しい数字が採番される。 ちなみに、AUTO_INCREMENTは0からではなく1から始まる。

mysqldumpでは自動的にこのモード(NO_AUTO_VALUE_ON_ZERO)を有効にする。つまり、0という値がAUTO_INCREMENTカラムにあれば、それはそのまま(新しい数字が採番されることなく)0として挿入されるということみたい。

例えばAUTO_INCREMENTで作ったデータを後からupdateでそのカラムを0とするような利用方法の時かな。

CREATE TABLE A (
  A INT AUTO_INCREMENT,
  B CHAR(1),
  PRIMARY KEY(A, B)
);

INSERT INTO A VALUES(0, 'A');
INSERT INTO A VALUES(null, 'B');
INSERT INTO A VALUES(0, 'C');

SELECT * FROM A;
+---+---+
| A | B |
+---+---+
| 1 | A |
| 2 | B |
| 3 | C |
+---+---+

UPDATE A SET A=0;

SELECT * FROM A;
+---+---+
| A | B |
+---+---+
| 0 | A |
| 0 | B |
| 0 | C |
+---+---+

こんなデータをダンプしてNO_AUTO_VALUE_ON_ZEROのモードがない状態でロードしてしまうと、新しく数字が採番されてしまい、データの再現ができなくなってしまうってことのようです。

関連記事
タグ:MySQL
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。