如何检查值是否已经存在以避免重复?

时间:2020-03-05 18:52:53  来源:igfitidea点击:

我有一个URL表,并且我不需要任何重复的URL。如何使用PHP / MySQL检查表中是否已存在给定URL?

解决方案

回答

我们可以执行以下查询:

SELECT url FROM urls WHERE url = 'http://asdf.com' LIMIT 1

然后检查mysql_num_rows()== 1是否存在。

回答

我不知道MySQL的语法,但是我们所要做的就是用IF语句包装INSERT,该语句将查询表,并查看具有给定URL EXISTS的记录是否存在(如果存在),请不要插入新记录。

如果是MSSQL,则可以执行以下操作:

IF NOT EXISTS (SELECT 1 FROM YOURTABLE WHERE URL = 'URL')
INSERT INTO YOURTABLE (...) VALUES (...)

回答

如果我们不想重复,可以执行以下操作:

  • 添加唯一性约束
  • 使用" REPLACE"或者" INSERT ... ON DUPLICATE KEY UPDATE"语法

如果多个用户可以向DB中插入数据,@ Jeremy Ruten建议的方法可能会导致错误:执行检查后,某人可以将相似的数据插入表中。

回答

如果我们只是想回答"是"或者"否",则此语法应可为我们提供最佳性能。

select if(exists (select url from urls where url = 'http://asdf.com'), 1, 0) from dual

回答

如果我们只是想确保没有重复项,则在url字段中添加唯一索引,这样就无需显式检查url是否存在,只需正常插入即可,如果已经存在,则插入将失败,出现重复的键错误。

回答

为了保证唯一性,我们需要添加唯一约束。假设表名是" urls",列名是" url",则可以使用此alter table命令添加唯一约束:

alter table urls add constraint unique_url unique (url);

如果表中已经有重复的URL,则alter table可能会失败(他对MySQL确实很了解)。

回答

我们是否纯粹担心URL完全相同的字符串..如果这样,其他答案中有很多好的建议。还是我们还需要担心标准化?

例如:http://google.com和http://go%4fgle.com是完全相同的URL,但是任何仅数据库技术都允许将其作为重复项。如果这是一个问题,则应预处理URL以便解析和字符转义序列。

根据URL的来源,我们还必须担心参数以及它们在应用程序中是否重要。

回答

如果要在表中插入url,但只有已经不存在的url,则可以在该列上添加UNIQUE约束,并在INSERT查询中添加IGNORE,以免出现错误。

例如:INSERT IGNORE INTOurlsSET url ='url-to-insert'

回答

答案取决于我们是否想知道何时尝试输入具有重复字段的记录。如果我们不在乎,请使用" INSERT ... ON DUPLICATE KEY"语法,因为这将使尝试悄然成功,而不会创建重复项。

另一方面,如果我们想知道何时发生此类事件并阻止该事件发生,则应使用唯一的键约束,该约束将导致尝试的插入/更新因有意义的错误而失败。