我正在将一些数据从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
答案 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]."'
);");