如何强制MySQL将0作为有效的自动增量值

时间:2009-07-17 10:20:44

标签: mysql auto-increment

长话短说,我有一个我要导入为skel样式文件的SQL文件,所以这将以编程方式重复完成。我可以编辑我想要的SQL文件,但我不想触摸应用程序本身。

此应用程序使用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一般是的,我实际上想要插入{{1进入这个领域?

4 个答案:

答案 0 :(得分:88)

从答案我得到here

您可以使用:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

here所述,将阻止MySQL将INSERT / UPDATE ID 0解释为下一个序列ID。此类行为将限制为NULL。

这是我认为应用程序的非常糟糕的行为。你必须要非常小心它的使用是一致的,特别是如果你选择在以后实现复制。

答案 1 :(得分:26)

使用以下命令检查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 dev page topic

<强>更新

对于MariaDB,请使用this comment

中指出的命令
SET sql_mode='NO_AUTO_VALUE_ON_ZERO'

答案 2 :(得分:11)

如果你不想处理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使用负值。

答案 3 :(得分:6)

安全失败:

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
  • 检查是否已在sql_mode中设置NO_AUTO_VALUE_ON_ZERO
  • 如果不为空,则添加到sql_mode
  • 仅设置会话,我建议仅在需要插入0
  • 的会话中使用它