我有一张桌子 (id,location,timestamp,type,value)
位置/时间戳/类型可以复制,但是位置+时间戳+类型是唯一的
1," Paris",1474986000," a"," 100"
2," London",1474986000," a"," 90"
3," Paris",1474986000," b"," 12"
4,"伦敦",1474986000," b"," 13"
5," Paris",1474990000," a"," 100"
6,"伦敦",1474990000," a"," 100"
7," Paris",1474990000," a"," 100"
8," London",1474990000," a"," 100"
我尝试使用select语句在插入之前检查已存在,但我有> 100000记录,它花了很多时间来检查
任何其他解决方案都可以解决这个问题吗?感谢〜
答案 0 :(得分:2)
如果列的组合存在唯一约束,则假设这些列都声明为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内部执行检查,使用带有SELECT语句的INSERT ... SELECT ...
包括反连接以消除已存在的行。此方法仅检查表中已存在的行,而不检查SELECT语句可能生成的“重复”。
答案 1 :(得分:1)
您可以使用INSERT IGNORE
来保持脚本运行,并且不会插入重复的密钥。或者您可以使用INSERT ... ON DUPLICATE KEY...