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

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

现在,我想我可以将INSERT查询UPDATE放入我的 SQL 文件中,但是有没有办法告诉 MySQL,是的,我确实想插入0到这个字段中?

答案1

您可以使用:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

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

不过,我认为这是应用程序的非常糟糕的行为。您必须非常小心地始终使用它,特别是如果您选择在以后实现复制。

答案2

使用以下命令检查 SQL DB 模式:

SELECT @@[GLOBAL|SESSION].sql_mode;

如果为空或者未设置,请使用:

 SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

小心!如果你使用GLOBAL,这不是立即更改,您需要重新启动连接才能应用设置。

因此,如果你要将数据从一个数据库还原到另一个数据库,并且不确定此设置是否适用,请使用SESSIONsql_mode立即更改(关闭连接时重置)。完成后,插入 0 值,即使更改也不会改变。

要重置此模式(和其他模式),请使用

 SET [GLOBAL|SESSION] sql_mode=''

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

欲了解更多信息,请查看mysql dev 页面主题在此

相关内容