Mysql

如何強制 MySQL 將 0 作為有效的自增值

  • November 10, 2017

長話短說,我有一個 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 開發頁面主題

引用自:https://serverfault.com/questions/42071