忽略重复的行

时间:2015-10-14 22:35:38

标签: php mysql

我正在将一些数据从csv文件导入MySQL并尝试忽略重复的行。

mysql_query("INSERT IGNORE INTO products (parent_product_url, child_product_url, swatch) VALUES ('".$row[0]."', '".$row[1]."', '".$row[2]."')");

我的csv文件。

polo.htm,red.htm,red.jpg
polo.htm,green.htm,green.jpg
round-neck.htm,green.htm,green.jpg

现在,如果我在csv文件下运行它应该忽略前三行,因为它们已经存在于表中。它应该只插入第四行。

polo.htm,red.htm,red.jpg
polo.htm,green.htm,green.jpg
round-neck.htm,green.htm,green.jpg
v-neck.htm,red.htm,red.jpg

3 个答案:

答案 0 :(得分:1)

我更喜欢on duplicate key update,因为insert ignore会忽略所有错误,而不仅仅是重复错误。

无论您使用哪种,您的问题可能都是缺少唯一约束/索引。

你没有明确说明你的意思"重复"。假设你的意思是所有列:

create unique index unq_products_3 on products(parent_product_url, child_product_url, swatch);

注意:索引使用的密钥的最大长度取决于存储引擎。如果列太长,您可能需要考虑其他方法。

答案 1 :(得分:0)

重新执行insert语句时会再次插入记录,因为插入不会违反任何唯一键或主键索引。因此,MySQL没有什么可以忽略的。

create table products (
  parent_product_url varchar(100), 
  child_product_url varchar(100), 
  swatch varchar(100)
);

-- this will enter both records
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg');
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg');

-- this will enter both records **AGAIN**
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg');
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg');

现在让我们为parent_product_url添加唯一性,然后再试一次:

truncate table products;
create unique index uk_products_parent_product_url on products(parent_product_url);
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg');
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg');

这将只输入第一条记录。第二条记录将被忽略,并将发出警告。不会抛出任何错误。

如果你希望将3列的组合变得独一无二,那么你会这样做(这也是Gordon Linoff所提到的......我只是添加更多上下文):

alter table products drop key uk_products_parent_product_url;
create unique index uk_products_parenturl_childurl_swatch on 
  products(parent_product_url, child_product_url, swatch);
insert ignore into products values ('polo.htm', 'red.htm', 'red.jpg');
insert ignore into products values ('polo.htm', 'green.htm', 'green.jpg');

现在,即使多次重新执行相同的2个插入语句,您也只会看到插入两条记录。

来自https://dev.mysql.com/doc/refman/5.5/en/insert.html

  

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

答案 2 :(得分:0)

我在这个答案的帮助下解决了这个问题 - > Insert query check if record exists - If not, Insert it

以下是我更新的查询

mysql_query("INSERT INTO products (parent_product_url, child_product_url, swatch)
             SELECT * FROM (SELECT '".$row[0]."', '".$row[1]."', '".$row[2]."') AS tmp
             WHERE NOT EXISTS (
             SELECT * FROM products WHERE parent_product_url='".$row[0]."' AND child_product_url='".$row[1]."' AND swatch='".$row[2]."'
             );");