Python MySQLdb:将重复条目插入到具有唯一字段的表中

Python MySQLdb:将重复条目插入到具有唯一字段的表中,python,mysql,duplicates,mysql-python,Python,Mysql,Duplicates,Mysql Python,我有一个MySQL数据库,其中包含一个名为commands的表,其结构如下: +-----------+---------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+---------------+------+-----+---------+----------------+ |

我有一个MySQL数据库,其中包含一个名为
commands
的表,其结构如下:

+-----------+---------------+------+-----+---------+----------------+
| Field     | Type          | Null | Key | Default | Extra          |
+-----------+---------------+------+-----+---------+----------------+
| id        | int(11)       | NO   | PRI | NULL    | auto_increment |
| input     | varchar(3000) | NO   |     | NULL    |                |
| inputhash | varchar(66)   | YES  | UNI | NULL    |                |
+-----------+---------------+------+-----+---------+----------------+
我试图在其中插入行,但前提是
inputhash
字段不存在。我以为
INSERT IGNORE
是这样做的,但我仍然收到警告

例如,假设able已经包含

+----+---------+------------------------------------------------------------------+
| id | input   | inputhash                                                        |
+----+---------+------------------------------------------------------------------+
|  1 | enable  | 234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9 |
+----+---------+------------------------------------------------------------------+
然后在使用以下Python代码插入行时

import MySQLdb

db = MySQLdb.connect(host='xxx.xxx.xxx.xxx', user='xxxx', passwd='xxxx', db='dbase')
c = db.cursor()
c.execute('INSERT IGNORE INTO `commands` (`input`, `inputhash`) VALUES (%s, %s)', ('enable', '234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9',))
我收到了警告

Warning: Duplicate entry '234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9' for key 'inputhash'
  c.execute('INSERT IGNORE INTO `commands` (`input`, `inputhash`) VALUES (%s, %s)', ('enable','234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9',))
为什么会发生这种情况?我认为在具有
唯一
字段的表上使用
INSERT IGNORE
的全部目的是抑制错误并忽略写入尝试


解决这个问题的正确方法是什么?我想我可以用
警告来抑制Python中的警告。filterwarnings('ignore')
,但是为什么首先会出现警告?

我希望它能帮助您

import MySQLdb

db = MySQLdb.connect(host='xxx.xxx.xxx.xxx', user='xxxx', passwd='xxxx', 
db='dbase')
c = db.cursor()
c.execute('INSERT INTO `commands` (`input`, `inputhash`) VALUES ('enable', 
'234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9') ON 
DUPLICATE KEY UPDATE 'inputhash'='inputhash')

我希望它能帮助你

import MySQLdb

db = MySQLdb.connect(host='xxx.xxx.xxx.xxx', user='xxxx', passwd='xxxx', 
db='dbase')
c = db.cursor()
c.execute('INSERT INTO `commands` (`input`, `inputhash`) VALUES ('enable', 
'234a86bf393cadeba1bcbc09a244a398ac10c23a51e7fd72d7c449ef0edaa9e9') ON 
DUPLICATE KEY UPDATE 'inputhash'='inputhash')

如果使用IGNORE修饰符,则会忽略执行INSERT语句时发生的错误。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,将丢弃该行,并且不会发生错误。忽略的错误会生成警告。()特别注意“忽略的错误反而会生成警告”。因此,避免在数据库中存储重复数据的唯一“干净”方法(无错误,无警告)是关闭警告?!由于竞争条件的原因,我无法检查该值是否已经存在(在我确定该值不存在后,有人可能会在我编写我的值之前编写与我相同的值)。我尝试锁定表,但也没有成功。如果使用IGNORE修饰符,则会忽略执行INSERT语句时发生的错误。例如,在不忽略的情况下,复制表中现有唯一索引或主键值的行将导致重复键错误,语句将中止。使用IGNORE时,将丢弃该行,并且不会发生错误。忽略的错误会生成警告。()特别注意“忽略的错误反而会生成警告”。因此,避免在数据库中存储重复数据的唯一“干净”方法(无错误,无警告)是关闭警告?!由于竞争条件的原因,我无法检查该值是否已经存在(在我确定该值不存在后,有人可能会在我编写我的值之前编写与我相同的值)。我试着锁桌子,但也没用。你到底想在这里做什么<重复密钥更新时的代码>通常用于在写入操作不会正常发生时强制执行写入操作,因为有一个
唯一的
字段。另外,在我的例子中,我有一个自动递增的字段,所以这不会导致重复的行吗?我不想要重复的行;我想重复的信息被忽略。我只是不想收到警告。你到底想在这里做什么<重复密钥更新时的代码>通常用于在写入操作不会正常发生时强制执行写入操作,因为有一个
唯一的
字段。另外,在我的例子中,我有一个自动递增的字段,所以这不会导致重复的行吗?我不想要重复的行;我想重复的信息被忽略。我只是不想在这种情况下收到警告。