如何强制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是一个无效的值。 或者至less,如果将其设置为0,则基本上告诉MySQL:“请在此字段中插入下一个ID”。

现在,我想我可以把INSERTUPDATE查询放到我的SQL文件中,但是有没有办法告诉MySQL,是的,我真的想在这个字段中插入0

您可以使用:

 SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

如下所述,将阻止MySQL将INSERT / UPDATE ID解释为下一个序列ID。 这样的行为将被限制为NULL。

这是我认为从应用程序,但非常不好的行为。 您必须非常小心地使用它,特别是如果您select在以后实施复制。

检查你的SQL DB模式:

 SELECT @@[GLOBAL|SESSION].sql_mode; 

如果没有设置,请使用:

  SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

小心! 如果您使用GLOBAL ,这不是一个中立的变化,您需要重新启动您的连接来应用设置。

因此,例如,如果要将数据从一个数据库还原到另一个数据库,并且不确定是否应用此设置,请使用SESSION进行中间更改(在closures连接时重置)。 完成后,插入0值,即使sql_mode改变也不会改变。

重置这个模式(和其他)使用

  SET [GLOBAL|SESSION] sql_mode='' 

不build议使用零自动增量值,因为它没有在mysql数据库中设置为默认值。

有关更多信息,请查看mysql dev页面主题