MySQL --當AUTO_INCREMENT自增遇到0
熟悉SQL Server的DBA都知道,在SQL Server中如果想要顯示制定自增值,除了在INSERT語句中顯示寫明自增列外,還需要使用SET IDENTITY_INSERT TB_NAME ON來告訴系統“我要顯示插入自增啦”,但到了MySQL,顯示插入自增就變得很“自由”。
假設有表tb1,其定義如下:
CREATE TABLE `tb1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c1` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
如果需要顯示插入自增,可以使用:
INSERT INTO tb1 VALUES(1,1);
當然寫明列肯定是沒問題的:
INSERT INTO tb1(id,c1)VALUES(2,2);
設置插入負值的自增值也沒有問題:
INSERT INTO tb1(id,c1)VALUES(-1,-1);
那插入0呢?
INSERT INTO tb1(id,c1)VALUES(0,0);
雖然顯示插入自增值為0,但是自增值變成了1,這是啥意思呢?
查看了下MySQL幫助文檔,發現該問題和一個變量有關:NO_AUTO_VALUE_ON_ZERO,一般情況下,在插入記錄時,如果自增列對於的數據為NULL或0時,系統會獲取一個新的自增值來作為本次插入的自增值使用,如果希望將0作為自增值來使用,那些需要設置SQL MODE 為NO_AUTO_VALUE_ON_ZERO,如:
SET SESSION sql_mode=‘NO_AUTO_VALUE_ON_ZERO‘;
=======================================================================
官方文檔如下:
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.
it encounters the 0 values, resulting in a table with contents different from the one that was dumped. Enabling NO_AUTO_VALUE_ON_ZERO before reloading the dump file solves this problem. mysqldump now automatically includes in its output a statement that enables NO_AUTO_VALUE_ON_ZERO, to avoid this problem.
=======================================================================
盡管可以通過NO_AUTO_VALUE_ON_ZERO來將自增值設置為0,但不建議將自增值設置為0,以避免在數據遷移或同步時因環境設置不同而導致數據差異,如從庫未設置NO_AUTO_VALUE_ON_ZERO的情況下通過mysqldump導入初始化數據,便會導致數據不一直或初始化失敗。
=======================================================================
MySQL --當AUTO_INCREMENT自增遇到0