Mysql
如何強制 MySQL 將 0 作為有效的自增值
長話短說,我有一個 SQL 文件,我想將其作為
skel
樣式文件導入,所以這將以程式方式重複完成。我可以隨心所欲地編輯 SQL 文件,但我不想觸及應用程序本身。此應用程序用於
userid = 0
表示匿名使用者。它還在數據庫中有一個相關的(空白)條目來表示這個“使用者”。因此,我的行skel.sql
看起來像這樣:INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
問題在於這
uid
是一個auto_increment
欄位,從技術上講,0
它是一個無效值。或者至少,如果你將它設置為 0,你基本上是在告訴 MySQL,“請在這個欄位中插入下一個 id。”現在,我想我可以在我的 SQL 文件中放入
INSERT
一個UPDATE
查詢,但是有沒有辦法告訴 MySQL 是的,我實際上想插入0
到這個欄位中?
您可以使用:
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
如此處所述,這將阻止 MySQL 將 0 的 INSERT/UPDATE ID 解釋為下一個序列 ID。這種行為將被限制為 NULL。
不過,我認為這是應用程序中非常糟糕的行為。您必須非常小心地使用它,特別是如果您選擇在以後實施複制。
使用以下命令檢查您的 sql DB 模式:
SELECT @@[GLOBAL|SESSION].sql_mode;
如果它為空或未設置,請使用:
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
當心!如果您使用**
GLOBAL
**,這不是即時更改,您需要重新啟動連接以應用設置。因此,例如,如果您要將數據從一個數據庫恢復到另一個數據庫,並且您不確定是否應用了此設置,請使用**
SESSION
**中間更改(關閉連接時重置)。完成後,插入 0 值,即使更改也不會sql_mode
更改。要重置此模式(和其他),請使用
SET [GLOBAL|SESSION] sql_mode=''
不建議使用零自動增量值,因為它沒有在 mysql 數據庫中設置為預設值。
有關更多資訊,請查看有關此的mysql 開發頁面主題