Mysql 通过Tkinter更新记录时出错
在MySQL中名为TCL的表中,我可以插入记录,但在更新它时,我遇到以下错误:-Mysql 通过Tkinter更新记录时出错,mysql,tkinter,sql-update,Mysql,Tkinter,Sql Update,在MySQL中名为TCL的表中,我可以插入记录,但在更新它时,我遇到以下错误:- Exception in Tkinter callback Traceback (most recent call last): File "C:\Users\sapna\anaconda3\lib\site-packages\mysql\connector\connection_cext.py", line 489, in cmd_query raw_as_string=raw_as_str
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Users\sapna\anaconda3\lib\site-packages\mysql\connector\connection_cext.py", line 489, in
cmd_query
raw_as_string=raw_as_string)
_mysql_connector.MySQLInterfaceError: Duplicate entry '3211' for key 'tcl.PRIMARY'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\sapna\anaconda3\lib\tkinter\__init__.py", line 1705, in __call__
return self.func(*args)
File "C:\Users\sapna\Desktop\SAMARTH.py", line 381, in uprec
libcur.execute(update)
File "C:\Users\sapna\anaconda3\lib\site-packages\mysql\connector\cursor_cext.py", line 266, in
execute
raw_as_string=self._raw_as_string)
File "C:\Users\sapna\anaconda3\lib\site-packages\mysql\connector\connection_cext.py", line 492, in
cmd_query
sqlstate=exc.sqlstate)
mysql.connector.errors.IntegrityError: 1062 (23000): Duplicate entry '3211' for key 'tcl.PRIMARY'
这是代码
def uprec():
b1=bn.get()
b2=bi.get()
b3=au.get()
b4=D.get()
b5=DO.get()
b6=RE.get()
b7=var1.get()
b8=RN.get()
b9=A.get()
bn.delete(0,END)
bi.delete(0,END)
au.delete(0,END)
D.delete(0,END)
DO.delete(0,END)
RE.delete(0,END)
RN.delete(0,END)
A.delete(0,END)
update="UPDATE TCL SET Book_id='%s',Book_name='%s',Author='%s',DOI='%s',DOR='%s',Reissues='%s',Recipients_Name='%s',Address='%s',Genre='%s'"%(b2,b1,b3,b4,b5,b6,b7,b8,b9)
libcur.execute(update)
mydb.commit()
mydb.close()
其中bn、bi、au、D、DO、RE、RN和A是分配给条目小部件的变量,var1是下拉列表。我不明白该怎么办。在update语句中,没有
where
子句。只有使用where
子句指定应该更新哪个记录时,代码才起作用。SQLUPDATE
语句不带where
子句将更新表中的所有记录。如果有列设置为主键
,将引发重复异常
您应该添加一个WHERE
子句,并使用主键
列作为筛选器(我认为对于您的情况,应该是Book\u id
),如下所示:
update=“update TCL SET Book\u name=%s,Author=%s,DOI=%s,DOR=%s,重新发行=%s,收件人\u name=%s,地址=%s,类型=%s,其中Book\u id=%s”
libcur.execute(更新,(b1、b3、b4、b5、b6、b7、b8、b9、b2))
请注意,占位符是用来代替字符串替换的。update语句将更新
TCL
表中的所有记录,因为没有WHERE
子句。您应该添加一个WHERE
子句,并使用Book\u id
作为过滤器。建议您进一步研究SQL,否则您会像下面的更新语句一样损坏您的数据库。“%s”与%s一样吗?@CoolCloud当%s
用作占位符时,它不应该用引号括起来。我同意,但在许多教科书中我见过它使用“%s”,我从未尝试过,它会出错吗?使用占位符,驱动程序将为您执行类型检查。如果列的类型为string,它将自动用引号括住数据。因此,如果使用'%s'
,最终结果是'abc'
或'abc'
,这不是您想要的结果。