在mysql和python中如何防止表中出现重复条目

在mysql和python中如何防止表中出现重复条目,python,mysql,Python,Mysql,我正在制作一个脚本,将数据插入MySQL数据库,每天只需插入来自多个传感器的数据一次,但我找不到防止多个输入的方法。是否有办法检查条目是否存在,如果不存在,则只插入数据? 下面是我的代码中包含语法错误的部分。 抱歉,如果错误很明显,我是SQL新手 mycursor.execute(''' SELECT * FROM MotorControlDB.FSYesterdayVolume IF Date = %s AND DeviceID = %s THEN

我正在制作一个脚本,将数据插入MySQL数据库,每天只需插入来自多个传感器的数据一次,但我找不到防止多个输入的方法。是否有办法检查条目是否存在,如果不存在,则只插入数据? 下面是我的代码中包含语法错误的部分。 抱歉,如果错误很明显,我是SQL新手

 mycursor.execute('''
        SELECT * FROM MotorControlDB.FSYesterdayVolume
        IF Date = %s AND DeviceID = %s THEN
          INSERT INTO MotorControlDB.FSYesterdayVolume(DeviceID, VolumeYesterday, Date)
          VALUES (%s, '%s', '%s')
        END IF
        ''', (YesterdayDate, '2-ES-WC-FS', '2-ES-WC-FS', EastVolumeYesterday, YesterdayDate))

通常的做法是在创建的表定义中创建“唯一索引”。那么任何代码都不可能插入重复的代码。在我们的例子中,唯一的约束列是(DeviceID,Date)


有了这种安全性,程序可以做以下几件事之一:(1)尝试插入,如果插入失败并出现重复错误,则根据需要进行更新;(2) 首先尝试选择,如果更新成功,则选择其他插入;(3) 许多数据库都有一种称为“UPSERT”的机制,它是插入和更新(如果存在)的组合。

查看您的查询,我发现您正在检查
日期+设备ID
组合。因此,我假设这两种形式是一个唯一的ID。有了它,您可以在表上创建一个唯一的索引,以防止重复。例如:

CREATE UNIQUE INDEX uniq_idx
ON MotorControlDB.FSYesterdayVolume(Date,DeviceID);
然后您可以简单地使用
INSERT IGNORE
,如下所示:

INSERT IGNORE INTO MotorControlDB.FSYesterdayVolume(DeviceID, VolumeYesterday, Date)
VALUES (%s, '%s', '%s')

我不能使用唯一索引,因为我有多个设备在一个表中插入它们的数据,我有大约9个设备,它们每天都需要插入一次。通过在两列上同时创建一个唯一索引,意味着可以有多个DeviceID行和多个day行,但只有一行具有特定(DeviceID,day)组合。