78

长话短说,我有一个 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它是一个无效值。或者至少,如果你将它设置为 0,你基本上是在告诉 MySQL,“请在这个字段中插入下一个 id。”

现在,我想我可以在我的 SQL 文件中放入一个INSERTthenUPDATE查询,但是有没有办法告诉 MySQL 是的,我实际上想插入0这个字段?

4

4 回答 4

98

从我在这里得到的答案:

您可以使用:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

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

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

于 2009-07-17T10:59:09.837 回答
28

使用以下命令检查您的 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 开发页面主题

更新

对于 MariaDB,请使用此评论中指出的命令

SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
于 2010-09-09T10:41:55.673 回答
16

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

于 2015-07-01T00:31:04.820 回答
9

故障安全方式:

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 的会话上使用它
于 2014-12-08T15:34:26.960 回答