Mysql 通过Tkinter更新记录时出错

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

在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_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
子句指定应该更新哪个记录时,代码才起作用。

SQL
UPDATE
语句不带
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'
,这不是您想要的结果。