【问题标题】:How to use SQL - INSERT...ON DUPLICATE KEY UPDATE?如何使用 SQL - INSERT...ON DUPLICATE KEY UPDATE?
【发布时间】:2011-02-12 19:11:52
【问题描述】:

我有一个脚本,可以捕获推文并将它们放入数据库。我将在 cronjob 上运行脚本,然后在我的网站上显示来自数据库的推文,以防止达到 twitter API 的限制。

所以我不想在我的数据库中有重复的推文,我知道我可以使用 'INSERT...ON DUPLICATE KEY UPDATE' 来实现这一点,但我不太明白如何使用它。

我的数据库结构如下。

表 - 哈希 id (auto_increment) 鸣叫 用户 用户网址

目前我要插入的SQL如下:

$tweet = $clean_content[0];
$user_url = $clean_uri[0];
$user = $clean_name[0];

$query='INSERT INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")';
mysql_query($query);

如何正确使用“INSERT...ON DUPLICATE KEY UPDATE”仅在不存在时插入,如果存在则更新?

谢谢

【问题讨论】:

标签: sql mysql


【解决方案1】:

你的桌子上需要一些 UNIQUE KEY,如果 user_url 是 tweer_url,那么这应该适合(每条推文都有一个唯一的 url,id 会更好)。

CREATE TABLE `hash` (
  `user_url` ...,
  ...,
  UNIQUE KEY `user_url` (`user_url`)
);

最好在你的情况下使用 INSERT IGNORE

$query='INSERT IGNORE INTO hash (tweet, user, user_url) VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'")';

当您需要更新现有行但只想插入一次时,ON DUPLICATE KEY 很有用

【讨论】:

  • 感谢您的回复,这似乎对我有用。虽然我认为我会使用 Twitter 帖子的 ID 而不是 URL,但我假设 ID 是 11 位数字,例如 - 12935503743
【解决方案2】:

ON DUPLICATE KEY UPDATE 似乎不是正确的解决方案,因为如果值已经在表中,您不想更新。

我会使用 Twitter 自己的唯一状态 ID 字段(对于每条推文应该是唯一的)而不是您的哈希 ID。将其作为字段添加到表中,并将其定义为主键(或唯一索引)。然后使用 REPLACE INTO,包括来自 Twitter 的状态 ID。

这样做的好处是,您可以随时将您的记录追溯到 twitter 上的唯一推文,因此您可以在以后轻松获取有关该推文的更多信息。

【讨论】:

    【解决方案3】:

    尝试使用:

    $query='INSERT INTO hash (tweet, user, user_url) 
            VALUES ("'.$tweet.'", "'.$user.'", "'.$user_url.'") 
            ON DUPLICATE KEY UPDATE tweet = VALUES(tweet)';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2013-10-03
      • 2015-07-30
      • 1970-01-01
      • 2011-01-29
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多