我将在 SQL 中运行数千个查询,并且我需要防止字段“域”的重复。以前从来没有这样做过,任何帮助将不胜感激。
6 回答
您可能想在字段“域”上创建一个“唯一”约束 - 如果您在数据库中创建两个具有相同域的行,此约束将引发错误。有关解释,请参阅W3C 学校的本教程-
http://www.w3schools.com/sql/sql_unique.asp
如果这不能解决您的问题,请说明您选择使用的数据库(MySql?)。
注意:此约束与您选择 PHP 作为编程语言完全不同,它是 SQL 数据库定义的东西。在 SQL 中表达此约束的一个巨大优势是,即使人们从数据库导入/导出数据、您的应用程序有问题或其他应用程序共享数据库,您也可以信任数据库来保留该约束。
如果这是一个绝对的数据库完整性要求(它不太可能改变,现有数据也没有这个问题),我会在数据库中使用唯一约束强制它。
至于在尝试之前或之后检测它以通知用户,有许多可以使用的技术。
数据从何而来?这是您只想运行一次、几次还是经常运行的东西?如果域值已经存在,您只是想跳过插入还是做其他事情(即增加一个计数器)?
根据您的答案,有许多可能的解决方案:
对数据进行预排序,消除重复,然后插入(假设数据相对静态,以空表开头)
在 PHP 中使用关联数组作为本地域值缓存(如果表已经包含数据,则从读取现有内容开始;不是线程安全的,但如果它一次只运行一次就可以工作)
使域成为唯一列并编写包装器代码来处理返回错误
将 domain 设为 UNIQUE 或 PRIMARY KEY 列并使用 ON DUPLICATE KEY 子句: INSERT INTO mydata ( domain, count ) VALUES ( 'firstdomain', 1 ), ( 'seconddomain', 1 ), ( 'thirddomain', 1 ) ON DUPLICATE密钥更新计数 = 计数 + 1
将所有数据插入表中,然后删除重复项
请注意,批处理插入(即每个语句使用多个值子句)可以明显更快。
我不确定我是否理解您的问题,但也许您正在寻找 SQL 的"UNIQUE" 约束。如果查询尝试将预先存在的值插入到字段中,您 (PHP) 将收到有关此约束违规的通知。
有很多方法可以解决这个问题。您可以在该列上设置唯一约束(如主键)。如果该域也已插入,这将导致插入失败。您也可以插入所有重复的域,然后再删除它们。如果没有那么多域重复,这将很有效。已经发布了一些关于查找重复行的问题。
这可以用 sql 来完成,而不是用 php。
我假设您使用的是 MySQl,但相同的原则适用于不同的数据库。
使 Domain 列成为主键。(有道理,因为它必须是独一无二的。)
与其使用 INSERT,不如使用 UPDATE。
如果主键已经存在(你试图放入表中), update 将更新现有的元组,而不是创建一个新的元组。
因此,如果现有数据不同,您将覆盖现有数据,如果相同,则将跳过更新。