2015-08-27 104 views
1

我有CSV文件,我需要在我的表中插入数据之前,做这样的事情:检查记录存在

table fields 
id = primary id and auto-increment 
house_no 
city_code 
prv_code 
cty_code 


if (house_no,city_code,prv_code,cty_code) exists = ignore insert 
else if (house_no,city_code,prv_code,cty_code) is null = ignore insert 
else (house_no,city_code,prv_code,cty_code) !exist = insert 

我原来的代码只是重新插入相同的值,因为主键ID只是为它创建一个新的ID,结果我有重复。

我需要这样做以避免重复。我试过INSERT IGNOREREPLACE,但我需要一个唯一的密钥,并且所有的字段可能有相同的值(比如它们可能有不同的house_no,但是相同的prv_codecty_code或类似的东西)。我只想在插入之前检查记录是否存在。

+0

我不确定如果我正确理解了你,但为什么不使用'TRIGGER'。但是,您提供了大量的信息。 – mic4ael

回答

1

您可以在多个列上创建唯一键。在你的情况下,你需要一个包含四列house_no,city_code,prv_codecty_code的唯一密钥。

你的情况:从CSV文件

ALTER TABLE fields 
ADD CONSTRAINT uc_fieldsUnique UNIQUE (house_no,city_code,prv_code, cty_code); 
0

将数据加载到第二个表,然后使用INSERT这样添加行 -

INSERT INTO t1(id, house_no, city_code, prv_code, cty_code) 
    SELECT NULL, t2.house_no, t2.city_code, t2.prv_code, t2.cty_code FROM t2 
    LEFT JOIN t1 ON t1.house_no = t2.house_no AND t1.city_code = t2.city_code AND t1.prv_code = t2.prv_code AND t1.cty_code = t2.cty_code 
     WHERE t1.id IS NULL 

(重命名表名)