2008-11-09 95 views

回答

9

您可能希望在字段“Domain”上创建一个“UNIQUE”约束 - 如果您创建两个在数据库中具有相同域的行,此约束将引发错误。有关说明,请参阅this tutorial in W3C school -

http://www.w3schools.com/sql/sql_unique.asp

如果这没有解决您的问题,请澄清你选择使用数据库(MySQL的?)。

注意:这个约束与您选择的PHP作为一种编程语言完全分开,它是一个SQL数据库定义的事情。在SQL中表达这种约束的一个巨大优势是,即使人们从数据库导入/导出数据,您的应用程序有问题或其他应用程序共享数据库时,也可以信任数据库以保留约束。

0

我不太确定我是否理解你的问题,但也许你正在寻找SQL的"UNIQUE" constraint。如果查询尝试将预先存在的值插入到字段中,您(PHP)将收到关于此约束违规的通知。

0

有很多方法可以解决这个问题。您可以在该列上设置唯一约束(如主键)。如果该域也被插入,这将导致插入失败。您也可以插入所有重复的域名,稍后再删除它们。如果不是那么多域重复的话,这将会很好。在查找重复行时,已经发布了几个问题。

1

如果这是一个绝对的数据库完整性要求(它不可能改变,现有数据也没有这个问题),我会强制它在数据库中有一个唯一的约束。

只要在尝试之前或之后检测它以通知用户,就可以使用许多技术。

0

这可以用sql做,而不是用php。

我假设你正在使用MySQl,但是相同的原则将与不同的数据库一起工作。

使域列成为主键。 (有意义,因为它必须唯一。)

而不是使用INSERT,请使用UPDATE。

如果主键已经存在(即您试图放入表中),更新将更新现有的元组,而不是创建新的元组。

所以你会覆盖现有的数据,如果它是不同的,如果它是相同的更新将被跳过。

1

数据来自哪里?这是你只想运行一次还是一次或者经常运行?如果域值已经存在,你只是想跳过插入或做别的事情(即增加一个计数器)?

根据您的答案,有很多可能的解决方案:

  1. 预排序数据,消除重复,然后插入 (假定相对静态的数据,空表开始)

  2. 在PHP中使用关联数组作为本地域值缓存 (如果表已经包含数据,则从读取现有内容开始; 不是线程安全的,但是一次只能运行一次即可使用)

  3. 制作域内唯一的列,写包装代码来处理返回错误

  4. 制作领域唯一或主键列,使用ON DUPLICATE KEY子句: INSERT INTO MYDATA(域,计数)VALUES (' firstdomain',1), ( 'seconddomain',1), ( '指向ThirdDomain',1) ON DUPLICATE KEY UPDATE计数=计数+ 1

  5. 插入所有数据插入表中,然后删除重复

请注意,批处理插入(即对每个语句使用多个值子句)可以显着更快。