【问题标题】:Mysql if data exists then do not insert it againMysql如果数据存在则不要再次插入
【发布时间】:2017-02-16 00:40:43
【问题描述】:

我使用下面的代码通过 PHP curl 函数从不同的网站获取数据。一切正常,但是当网站重新加载或刷新时,我将重复的数据输入到我的数据库中。
duplicate data screenshot

如果数据已经存在于Mysql数据库中,是否有任何理由基于下面的代码停止在重新加载时插入重复数据?我在谷歌上搜索了这个问题,但没有得到任何有用的信息。

if(isset($_POST['url'],$_POST['theme'])){

    $db = new Mysqli("localhost" , "iamniloy_wp###" , "(5uSE6[3OP" , "iamniloy_#@");

    $url = $db->real_escape_string($_POST['url']);
    $theme = $db->real_escape_string($_POST['theme']);


    $query = "INSERT INTO twist_data ( url,theme ) VALUES ('$url','$theme')";
    $db->query($query);

    }

【问题讨论】:

  • 您可以使用 Try Catch,而只需忽略重复 ID 异常,前提是您有一个唯一字段。
  • 数据会重复怎么办?网址、主题或两者兼而有之?
  • 创建一个唯一的索引并且改变你的数据库还为时不晚

标签: php mysql


【解决方案1】:

如果由于某种原因无法添加唯一索引,您可以使用EXISTS 来检查已经存在的记录:

INSERT INTO twist_data (url, theme)
SELECT * FROM (SELECT '$url','$theme') AS tmp
WHERE NOT EXISTS (
    SELECT * FROM twist_data WHERE url = '$url' AND theme = '$theme'
)

【讨论】:

  • LIMIT 1 ? :-)
  • @PaulSpiegel 谁把它放在那里的!?
  • 我听说SO上有一些妖精;-)
  • 谢谢@TimBiegeleisen。
【解决方案2】:

您应该更改表的结构,以便在相关列上具有唯一索引。

例如:

ALTER TABLE `twist_data` ADD UNIQUE INDEX `url` (`url`)

这样您将无法将相同的url 插入到您的表中。

如果您需要unique 同时出现在urltheme 上,您可以使用:

ALTER TABLE `twist_data` ADD UNIQUE INDEX `url_theme` (`url`, `theme`)

更多信息在MySQL Documentation

【讨论】:

  • 您可能还会提到INSERT IGNORE 语法。
【解决方案3】:

创建一个选择计数查询,您将在其中检查数据是否存在 做一个if条件。如果为真,则不插入,如果没有数据(假),则插入查询。

例如:

Select count(*) from twist_data where url='".$url."';

【讨论】:

    【解决方案4】:

    在插入查询中使用 ON DUPLICATE 关键字。见:INSERT ... ON DUPLICATE KEY (do nothing)

    并将列的索引设置为唯一。

    【讨论】:

    • on duplicate在您有唯一索引时才相关。
    • 已编辑。谢谢。 :)
    • 你检查我 7 分钟前的回答了吗? :)(投票将不胜感激)
    • 如果您只将索引设置为唯一,我很确定您的会引发错误。您还必须根据我的经验定义在这种情况下该怎么做。
    • query(...) 将返回 false,但没关系。
    【解决方案5】:

    用以下代码替换最后两个 ligne: $query = "select * from twist_data where url='$url'"; $db->query($query); if($db->num_rows>0){ $query = "INSERT INTO twist_data ( url,theme ) VALUES ('$url','$theme')"; $db->query($query); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-24
      • 1970-01-01
      • 2014-04-14
      • 2013-01-10
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多