Php 忽略重复行

Php 忽略重复行,php,mysql,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

我正在将一些数据从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

我更喜欢
重复密钥更新
,因为
插入忽略
忽略所有错误,而不仅仅是重复错误

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

您没有指定“复制”的含义。假设您指的是所有列:

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

注意:用于索引的键有一个最大长度,具体取决于存储引擎。如果列太长,您可能需要考虑其他方法。

当您重新执行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');
现在,让我们将唯一性添加到父产品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提到的……我只是添加了更多上下文):

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

如果使用IGNORE关键字,则会显示在执行 INSERT语句被忽略。例如,在不忽略的情况下,一行 复制表中现有的唯一索引或主键值 导致重复键错误,语句被中止。具有 忽略,将丢弃该行,并且不会发生错误。忽略的错误可能会 生成警告,但不会出现重复的密钥错误


在这个答案的帮助下,我解决了这个问题->

下面是我的最新查询

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]."'
             );");

产品上的主键是什么?你也有唯一的键吗?ID是主键,它有自动递增功能,我没有唯一的键,但我认为我们可以将“child\u product\u url”作为唯一的。好的,在这种情况下,MySQL运行正常<如果记录违反主键或唯一键,代码>插入忽略将抛出警告,并且不会插入记录。由于这三个字段的组合不违反任何约束,MySQL很高兴地一次又一次地插入这些数据。为了防止这种情况发生,您可以在父产品url上创建唯一的索引(如果这样做有意义的话)。那么你是在建议改变数据库结构吗?哦,不,你的数据库结构很好。正如Gordon提到的,为了防止这3个字段的组合出现重复值,您必须使用这3列添加一个唯一的复合索引。在我的回答中,我增加了一些例子供参考。
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]."'
             );");