Python 重复输入';0';对于键';初级';我不能使用自动增量,因为值并不总是增加 **我想做什么**

Python 重复输入';0';对于键';初级';我不能使用自动增量,因为值并不总是增加 **我想做什么**,python,mysql,tkinter,Python,Mysql,Tkinter,我一直试图通过tkinter向表中插入一条记录,我想在mysql上看到插入的记录。 问题 在向tkinter输入记录后,我收到以下错误。我研究了在线发布的相同错误的解决方案,但对列代码(带有主键的代码)使用自动增量。但是,我不能使用auto_increment,因为列代码的值并不总是增加。我也尝试过删除列的主键,但仍然出现相同的错误。对此有何见解? **错误:** *mysql.connector.errors.IntegrityError:1062(23000):键“PRIMARY”的重

我一直试图通过tkinter向表中插入一条记录,我想在mysql上看到插入的记录。

问题
在向tkinter输入记录后,我收到以下错误。我研究了在线发布的相同错误的解决方案,但对列代码(带有主键的代码)使用自动增量。但是,我不能使用auto_increment,因为列代码的值并不总是增加。我也尝试过删除列的主键,但仍然出现相同的错误。对此有何见解?


**错误:**
*mysql.connector.errors.IntegrityError:1062(23000):键“PRIMARY”的重复条目“0”*
**创建表的代码:*
#table
cursor=mycon.cursor(buffered=True)
cursor.execute("use iv")
cursor.execute("drop table if exists salesperson")
create_table='''create table salesperson
(
code int(4) primary key,
name varchar(15),
salary int,
itcode char
)'''
cursor.execute(create_table)

**从tkinter/python向mysql插入数据的代码:**

问题出在INSERT语句中:

tkcursor.execute("Insert into salesperson values (code,'name',salary,'itcode')")
当您在这样的SQL语句中引用标识符时,它是SQL标识符,而不是Python变量。在这种情况下这不是一个错误,因为您的表恰好有名为
code
salary
的列

但这些列的价值是什么?由于这是一条INSERT语句,根据定义,在计算VALUES()子句时,该行还不存在。因此,该行所有列的值都为NULL。就好像你做了这件事:

tkcursor.execute("Insert into salesperson values (NULL,'name',NULL,'itcode')")
因为
code
是主键,所以它不能为NULL。即使该列没有定义默认值,MySQL也有一个“默认值”的概念。也就是说,在没有明确定义的默认值的情况下,如果不接受NULL,则每个数据类型都将转换为适当的隐式默认值(有关此项的文档,请参阅)。对于整数,隐式默认值为0。所以你的陈述就像你做的那样:

tkcursor.execute("Insert into salesperson values (0,'name',NULL,'itcode')")
如何解决这个问题?您应该使用参数来帮助您将Python变量的值获取到SQL INSERT语句中。这样,将使用Python变量
code
,而不是名为
code
的SQL列。nbk的上述评论暗示了这一点

tkcursor=connection.cursor(prepared=True)
tkcursor.execute("Insert into salesperson values (%s,'name',%s,'itcode')", (code, salary,)
connection.commit()

有关更多信息,请参阅。

您是否尝试过打印(代码)以验证它是否符合您的期望?并不是以前的重复请使用准备好的语句和参数见谢谢联系。虽然我不太明白在哪里执行print(code),但我插入了一条与任何其他记录的值都不重复的记录。因此,简而言之,
prepared
的作用是什么?它允许在SQL查询(
%s
)中使用占位符,您可以将其与应用程序变量组合。简单的字符串替换或
.format()
更安全,因为它可以解释变量中是否包含文字引号字符,或者字符集是否存在差异。使用参数将变量与SQL语句组合是一个好习惯。它使您的查询不受SQL注入的影响,而且编写代码更容易。但我在没有任何
准备的
参数的情况下也这样做了。所以我想没有必要说“准备好了”?谢谢你给出了详细的答案。但即使在执行了您建议的代码之后,我还是收到了一个错误:数据对于第1行的“itcode”列来说太长。对此有什么见解吗?这是另一个问题。您将
itcode
声明为类型
char
。如果不提供长度,则
char
的默认长度限制是多少?默认设置就像您将其声明为
char(1)
。所以它只允许1个字符的字符串。如果试图存储长度超过1个字符的字符串,则会出现该错误。您需要确保Python变量
itcode
为1个字符,或者声明列以存储更长的字符串。
tkcursor=connection.cursor(prepared=True)
tkcursor.execute("Insert into salesperson values (%s,'name',%s,'itcode')", (code, salary,)
connection.commit()