2010-11-27 83 views
0

我必须从外部来源插入一些数据。
我的php函数定期运行并获取结果&将这些插入到表中。如何在mysql中丢弃重复记录的插入?

通常会有已保存的结果。
所以他们再次插入。

如何丢弃重复的结果以便只输入新结果&重复被丢弃。

+1

INSERT ... ON DUPLICATE KEY UPDATE ... - http:// dev。 mysql.com/doc/refman/5.0/en/insert-on-duplicate.html – ajreal 2010-11-27 15:10:30

+0

INSERT IGNORE`只会在没有唯一键冲突的情况下插入,否则什么也不做。 `ON DUPLICATE`将会更新。 `REPLACE`将删除/插入else。 – Konerak 2010-11-27 20:57:05

+0

我尝试避免使用REPLACE语句,因为它会删除任何唯一键冲突,而不仅仅是那些来自主键的冲突。 – Danosaure 2010-11-28 02:19:04

回答

1

如果您可以修改数据库表的结构,最好的方法是将列的UNIQUE INDEX或许多列一起添加唯一标识单个条目的列。例如:

ALTER TABLE table ADD UNIQUE INDEX namecolumn_onecolumn_two);

如果该表已经包含重复记录,则更改尝试将导致错误。在这种情况下,您可以用忽略:

ALTER TABLE忽略ADD table UNIQUE INDEX namecolumn_onecolumn_two);

请记住,创造不必要的巨大的索引将导致:采取

  • 更多的磁盘空间高达
  • 慢编写查询(INSERT,UPDATE,DELETE)

http://dev.mysql.com/doc/refman/5.1/en/create-index.html (页描述了创建索引的另一种方式,但也引用了ALTER TABLE)

0

我知道这听起来很愚蠢,但确定如何检测重复项并且不要插入它们。

这取决于您的数据集。如果您有唯一的字段,最简单的方法是在数据库中的该字段上设置唯一索引,即主键,并且数据库不允许插入副本。只要检查你的错误,如果你得到重复的关键错误,不理会你期望的东西。

0

这就是关于主键的一点,如果你明智地定义了主键,你将不必处理重复项,因为你不会有任何重复项。

0

INSERT IGNORE ...命令完成此操作,假设您在表上设置了主键。

如果您还没有主键,请将其设置为具有相同名称/ ID的记录的名称或ID,表示重复的数据。

0

所有关系数据库都允许在单个行上使用主键和唯一约束。

所以,如果你有一个PERSON表的first_namelast_nameperson_id柱和独特的组合,你应该让person_id主键和(first_name, last_name)添加的唯一约束。即使主键是唯一的,您也无法插入违反唯一约束的行。