长话短说,我有一个 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_increment
0
现在,我想我可以将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
,这不是立即更改,您需要重新启动连接才能应用设置。
因此,如果你要将数据从一个数据库还原到另一个数据库,并且不确定此设置是否适用,请使用SESSION
sql_mode
立即更改(关闭连接时重置)。完成后,插入 0 值,即使更改也不会改变。
要重置此模式(和其他模式),请使用
SET [GLOBAL|SESSION] sql_mode=''
不建议使用零自动增量值,因为它未在 mysql 数据库中设置为默认值。
欲了解更多信息,请查看mysql dev 页面主题在此