如何检查存在之前插入数据到mysql


php How to check existed before insert data to mysql

我有一个表(id, location, timestamp, type, value)

location/timestamp/type可以重复,
但是location + timestamp + type是唯一的


1, "Paris", 1474986000, "a", "100"
2、"London",1474986000,"a","90"
3、"Paris",1474986000,"b","12"
4、"London",1474986000,"b","13"
5、"Paris",1474990000,"a","100"
6、"London",1474990000,"a","100"
7、"Paris",1474990000,"a","100"
8、"London",1474990000,"a","100"


我试图在使用select语句插入之前检查是否存在,但是我有>100000条记录,它花费了很多时间来检查

还有其他方法可以解决这个问题吗?谢谢~

如果对列的组合有唯一的约束,假设这些列都声明为NOT NULL…

你可以创建一个唯一的索引。使用合适的SELECT语句,该索引将加速对现有行的"搜索"。

 CREATE UNIQUE INDEX mytable_UX1 ON mytable (location, timestamp, type)

但是如果您定义了一个UNIQUE INDEX,并且目标只是添加缺失的行,那么您可以使用INSERT IGNORE

 INSERT IGNORE INTO mytable ( ... ) VALUES ( ... ), ( ... )

尝试插入违反唯一约束的行不会抛出错误。IGNORE关键字使MySQL忽略的不仅仅是重复的键违反,它还将其他错误转换为警告。

如果使用IGNORE关键字,则忽略执行INSERT语句时出现的错误。例如,在没有IGNORE的情况下,如果一行与表中现有的UNIQUE索引或PRIMARY KEY值重复,则会导致重复键错误,并终止语句。对于IGNORE,该行被丢弃并且不发生错误。忽略的错误可能会生成警告,而重复键错误则不会。

我使用的另一种技术是在INSERT本身内执行检查,使用INSERT ... SELECT ...和SELECT语句(包括反连接)来消除已经存在的行。这种方法只检查表中已经存在的行,而不检查SELECT语句可能产生的"重复行"。

您可以使用INSERT IGNORE来保持脚本运行并且不插入重复的键。或者你可以使用INSERT ... ON DUPLICATE KEY...