使用PHP防止重复插入SQL

时间:2008-11-09 22:27:56

标签: database database-design indexing

我将在SQL中运行数千个查询,我需要防止字段“域”的重复。从来没有必要这样做,任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:9)

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

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

如果这不能解决您的问题,请澄清您选择使用的数据库(MySql?)。

注意:此约束完全独立于您选择的PHP作为编程语言,它是SQL数据库定义的东西。在SQL中表达此约束的一个巨大优势是,即使人们从数据库导入/导出数据,您的应用程序出错或其他应用程序共享数据库,您也可以信任数据库以保留约束。

答案 1 :(得分:1)

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

至于在尝试之前或之后检测它以通知用户,有许多技术可以使用。

答案 2 :(得分:1)

数据来自哪里?这是你只想运行一次,或几次,或经常?如果域值已经存在,您是否只想跳过插入或执行其他操作(即递增计数器)?

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

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

  2. 在PHP中使用关联数组作为本地域值缓存 (如果表已包含数据,请先阅读现有内容; 不是线程安全的,但如果它一次只运行一次就有效)

  3. 将域设为UNIQUE列并编写包装代码以处理返回错误

  4. 使域成为UNIQUE或PRIMARY KEY列并使用ON DUPLICATE KEY子句: INSERT INTO mydata(domain,count)VALUES  ('firstdomain',1),  ('seconddomain',1),  ('thirddomain',1) 在DUPLICATE KEY  UPDATE count = count + 1

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

有很多方法可以解决这个问题。您可以在该列上设置唯一约束(如主键)。如果还插入了域,这将导致插入失败。您也可以插入所有重复的域,稍后再删除它们。如果没有重复许多域,这将很有效。在发现重复行时已经发布了一些问题。

答案 5 :(得分:0)

这可以用sql来实现,而不是用php。

我假设您正在使用MySQl,但相同的原则适用于不同的数据库。

将“域”列设为主键。 (有道理,因为它必须是唯一的。)

使用UPDATE。而不是使用INSERT。

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

因此,如果现有数据不同,您将覆盖现有数据,如果相同,则会跳过更新。