2016-09-28 64 views
0

我有一个表 (ID,位置,时间戳,类型,值)PHP如何检查存在之前插入数据到mysql

位置/时间戳/类型可以复制,
但位置+时间戳+类型是独一无二的


1, “巴黎”,1474986000, “一”, “100”
2, “伦敦”,1474986000, “一”, “90”
3, “巴黎”,1474986000“ “b”,“12”
4,“伦敦”,1474986000,“b”,“13”
5“Paris”1474990000“a”100“
6”London“1474990000”a“100”
7“Paris”1474990000“a”100 “
8,‘伦敦’,1474990000,‘一’,‘100’


我试图检查使用select语句插入之前就已经存在,但我有> 100000的记录,它花了很多时间检查

任何其他解决方案可以解决这个问题?谢谢〜

+2

然后在这些字段上放上一个索引 – RiggsFolly

+0

或者编写INSERT查询并处理重复错误为OK – RiggsFolly

+0

请检查本文档: http://dev.mysql.com/doc/refman/5。7/EN /插入式,duplicate.html –

回答

1

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

2

如果在列的该组合的唯一约束,假定这些列都声明NOT NULL ...

您可以创建一个唯一索引。该索引将加快对现有行的“搜索”,并带有适当的SELECT语句。

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

但如果你有一个唯一索引定义,首要目标就是要添加缺少的行,你可以使用INSERT IGNORE

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

尝试插入一行违反了独特约束不会抛出错误。 IGNORE关键字导致MySQL不仅忽略重复的关键违规,而且还将其他错误转化为警告。

如果使用IGNORE关键字,则忽略执行INSERT语句时发生的错误。例如,如果没有IGNORE,表中重复表中现有的UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句会中止。使用IGNORE时,该行将被丢弃并且不会发生错误。忽略错误可能会产生警告,但重复键错误不会。

我用另一种技术是执行INSERT自身内部的检查,使用INSERT ... SELECT ... SELECT语句包括反连接,以消除已存在的行。此方法仅检查表中已存在的行,而不检查可能由SELECT语句产生的“重复”。

相关问题