2009-07-17 16 views
60

長話短說,我有一個SQL文件,我想導入爲skel樣式文件,因此這將通過編程方式重複執行。但是我可以編輯SQL文件,但我寧願不觸摸應用程序本身。如何強制MySQL將0作爲有效的自動增量值

此應用程序使用userid = 0來表示匿名用戶。它還在數據庫中有一個相關(空白)條目來表示這個'用戶'。因此,在我skel.sql行看起來是這樣的:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

這樣做的問題是,uidauto_increment領域,從技術上講,0是無效值。或者至少,如果將其設置爲0,則基本上告訴MySQL:「請將下一個ID插入此字段中。」

現在,我想我可以把一個INSERT那麼UPDATE查詢到我的SQL文件,但有沒有告訴MySQL的一般,是的,其實我是想插入0到這個領域的一種方式?

回答

74

從我得到了here答案:

您可以使用:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

其中所描述的here,將防止MySQL的從解釋爲0的INSERT/UPDATE ID爲下一個序列ID。這種行爲將被限制爲NULL。

這是我認爲從應用程序的非常不好的行爲,但。您必須非常小心,始終如一地使用它,特別是如果您選擇在以後實施複製。

+12

有一點你必須小心:`sql_mode`是一個逗號分隔的標誌列表。如果你做`sql_mode ='NO_AUTO_VALUE_ON_ZERO'`,你可能會無意中禁用其他標誌 – Kip 2014-05-14 14:55:25

+0

這個解決方案基本上爲我工作,但是我的轉儲還包括一些地方,它在SQL文件的中間覆蓋`sql_mode`,然後重置爲設置爲恢復到腳本末尾的變量OLD_SQL_MODE。這在我的腳本的中間覆蓋了我的`NO_AUTO_VALUE_ON_ZERO`,這使得這不起作用。我的解決方案是創建一個新的`INIT_OLD_SQL_MODE`變量,我用來重置到最後,並且在將`sql_mode`設置爲`NO_AUTO_VALUE_ON_ZERO`後,我設置了一個新變量'OLD_SQL_MODE`,這些臨時覆蓋可以重置爲 – 2016-06-03 21:36:44

19

檢查你的SQL數據庫模式:

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數據庫。

有關此

5

更多信息檢查mysql dev page topic故障安全方式:

SET @@session.sql_mode = 
    CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' 
     THEN CASE WHEN LENGTH(@@session.sql_mode)>0 
      THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO') -- added, wasn't empty 
      ELSE 'NO_AUTO_VALUE_ON_ZERO'         -- replaced, was empty 
     END 
     ELSE @@session.sql_mode            -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set 
    END 
  • 檢查是否NO_AUTO_VALUE_ON_ZERO中的sql_mode已經設置
  • 添加到,如果只有不爲空
  • 集SQL_MODE會議,我建議僅在需要插入0
  • 的會話中使用它10
4

如果你不想使用MySQL變量裂傷,這裏是一個有用的黑客:

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL); 

然後

UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1; 

很顯然,這是假定你不使用負值的你的桌面ID。