_mysql_exceptions.ProgrammingError:(1064,“您的SQL语法有错误;

时间:2018-10-21 16:05:11

标签: mysql python-3.6

        sql = ("INSERT INTO {0} "
               "(id, timestamp, status, priority, client, group, capacity, level, mail_id) "
               "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)".format(TABLE_NAME_MAIL))
        values = ('NULL', report['timestamp'], 'succeeded', report['priority'], c.strip(), report['group'], 'NULL', 'NULL', ref_mailid)
        cursor.execute(sql, values)
        #cursor.execute('INSERT INTO %s VALUES (NULL,"%s","%s","%s","%s","%s",NULL,NULL,"%s") ' % (TABLE_NAME_REPORT, report['timestamp'], 'succeeded', report['priority'], c.strip(), report['group'], ref_mailid))

已注释掉的cursor.execute起作用,未注释的抛出错误:

  

_mysql_exceptions.ProgrammingError:(1064,“您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以获取正确的语法以在'group,capacity,level,mail_id附近使用)VALUES('NULL ','2014-12-05 23:46:56','成功'在第1行“)

id”列中有AUTO_INCREMENT

为什么会出现此错误?

2 个答案:

答案 0 :(得分:3)

groupreserved keyword in MySQL。使用反引号转义名称

INSERT INTO {0} (id, timestamp, status, priority, client, `group`, capacity ...
                      here--------------------------------^-----^

甚至最好使用其他列名称。

请勿使用'NULL'作为参数。使用NULL不带引号或将其从查询中完全删除:

INSERT INTO {0} (timestamp, ...
                ^----------no ID

答案 1 :(得分:0)

使用自动递增列时,有两个选择:

  1. 在其中插入一个值(即:覆盖自动增量)
  2. 完全不要设置该列

1:

在设置值的情况下,如果要设置“ NULL”,则该列必须允许NULL。自动递增列很少出现这种情况,因为它会达到目的。

所以这是允许的:

INSERT INTO tab (id, sometext) VALUES (10,"Hi");

2:

替代(最常用)根本没有命名该列:

INSERT INTO tab (sometext) VALUES ("Hi");

这将导致mysql为表中的id分配一个值。