【问题标题】:MYSQL INSERT INTO syntax errorMYSQL INSERT INTO 语法错误
【发布时间】:2015-08-20 10:04:13
【问题描述】:

我想在下表中插入一个新行:

+-------------------+---------------------+------+-----+---------+-------+
| Field             | Type                | Null | Key | Default | Extra |
+-------------------+---------------------+------+-----+---------+-------+
| index             | bigint(20) unsigned | NO   | PRI | NULL    |       |
| exports_fields_id | bigint(20) unsigned | NO   | PRI | NULL    |       |
| exports_id        | bigint(20) unsigned | NO   | MUL | NULL    |       |
+-------------------+---------------------+------+-----+---------+-------+

为此我尝试了以下sql语句:

INSERT INTO 'exports_has_export_fields' ('index', 'exports_fields_id', 'exports_id') VALUES (0, 78, 3);

然后我收到以下错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ''exports_has_export_fields' ('index', 'exports_fields_id', 'exports_id') VALUES '附近使用正确的语法

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您正在使用单引号,但您需要反引号 (`) 来引用名称可能与 MySQL 保留关键字冲突的字段或表。

    在这种情况下,只有 index 是保留的,即使为了安全起见您可以反引号。

    所以你可以说:

    INSERT INTO `exports_has_export_fields` (`index`, `exports_fields_id`, `exports_id`) VALUES (0, 78, 3);
                ^                         ^  ^     ^  ^                 ^  ^          ^
    

    或者只是

    INSERT INTO exports_has_export_fields (`index`, exports_fields_id, exports_id) VALUES (0, 78, 3);
                                           ^     ^  
    

    来自When to use single quotes, double quotes, and backticks?

    反引号用于表和列标识符,但 仅当标识符为MySQL reserved keyword 时才需要, 或者当标识符包含空白字符或字符时 超出有限的集合(见下文) 通常建议避免 尽可能使用保留关键字作为列或表标识符, 避免引用问题。

    【讨论】:

      【解决方案2】:

      我认为字段 index 是主键,它不为零 试试

      SET sql_mode='NO_AUTO_VALUE_ON_ZERO';
      

      在插入 0 值之前。

      【讨论】:

        【解决方案3】:

        试试看(用反引号编辑)

        INSERT INTO `exports_has_export_fields` (`index`, `exports_fields_id`, `exports_id`) VALUES (0, 78, 3);
        

        表名和列名上不应有单引号。

        如果您要插入表格的所有列,您可以像这样缩短插入语句:

        INSERT INTO exports_has_export_fields VALUES (0, 78, 3);
        

        【讨论】:

        • 感谢您的简短陈述。上面的一个也失败了。只有缩短语句插入新行。你知道它失败了吗?
        • @user3205343 :尝试使用上面答案中提到的反引号。
        • 这不起作用,因为index 是 MySQL 中的保留关键字。
        【解决方案4】:

        您是否尝试过从表名和字段中删除单引号?

        INSERT INTO exports_has_export_fields (`index`, exports_fields_id, exports_id) VALUES (0, 78, 3);
        

        或者,如果您想缩短查询,请尝试

        INSERT INTO exports_has_export_fields VALUES (0, 78, 3);
        

        【讨论】:

          【解决方案5】:

          index 是一个reserved word。引用它(带反引号)。

          所以你应该使用反引号`而不是单引号'。

          INSERT INTO `exports_has_export_fields` (`index`, `exports_fields_id`, `exports_id`) VALUES (0, 78, 3);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-27
            • 2012-02-07
            • 1970-01-01
            相关资源
            最近更新 更多