检查重复记录

时间:2011-09-01 08:01:10

标签: php mysql

如何检查MySQL中的重复记录?
我的cronjob每分钟运行一次 所以我每分钟都在MySQL中插入相同的结果 如何确保只将非公开记录插入数据库并拒绝重复记录。

这是我的代码:

if($trim != $yesterdayresult){                                              
  while($user = mysql_fetch_array($checklist)){
    $usernumber = $user['msisdn'];
    $usertelco = $user['telco'];
    $userkw = $user['kw'];
    $usersc = $user['shortcode'];
    mysql_query("INSERT INTO mt_log 
             VALUES 
             ('','$Currentdatetime','$usernumber','$usertelco','$finalresult'
             ,'$userkw','$usersc','$price')");
  }
} else {echo "Results have not updated yet, please wait";}

2 个答案:

答案 0 :(得分:1)

  

我的cronjob必须每分钟运行

你每分钟都在跑cronjob吗?这不是一个好主意。虽然现在在专用机器上预期几秒钟内的平均抖动是合理的,但它仍然需要额外的控制来管理运行时重叠 - 特别是如果您正在使用ISAM数据表。如果需要处理,这通常会使守护进程更加可靠。

  

如何检查mysql中的重复记录

我看不到你的代码是如何检查重复的。如果你发现副本,你想做什么?

如果你不想在你的数据库中有重复的记录,那么在字段上创建一个唯一的密钥,这将导致记录重复,然后使用'INSERT'并处理ER_DUP_KEY错误或'INSERT IGNORE'或'REPLACE '或'INSERT .... ON DUPLICATE ....'

  

我必须在mysql中插入所有记录,然后在另一分钟再插入它。

所以你需要一个新列存储的唯一索引(NOW() - INTERVAL SECOND()SECOND)

然而,这听起来像是在创建一个非规范化的数据库 - 这也是一种不好的做法。有理由对数据库进行非规范化,特别是在预先合并结果方面 - 但在1分钟的分辨率下,您将无法获得任何性能优势。

查看您提供的实际代码,这看起来像某种电信计费应用程序 - 在这种情况下,您的计量方式完全错误 - 您应该只记录每次调用的开始和结束时间。

(BTW依赖于DML操作的列顺序/编号,而不是明确说明值在任何关系数据库中映射到的列也是草率的。)

答案 1 :(得分:1)

防止MySQL中的重复行

如果要阻止插入重复记录,请在要使其唯一的字段组合上指定UNIQUE索引。

ALTER TABLE mt_log ADD UNIQUE INDEX ui_indexname (column1, column2);

之后,MySQL将拒绝任何重复的行。

在MySQL中插入的正确方法

我建议您明确命名列:

INSERT IGNORE INTO mt_log (columname1, columnname2, .....) VALUES (.....)  

IGNORE部分会忽略错误,因此如果您一次插入多行并且第一行(但不是第二行)中有重复项,则它将不会停止,而只是忽略第一个插入并继续到第二个。

如果您不想为列指定值,请不要插入'',而是使用null

如果要覆盖重复的行

如果您希望重复行始终反映最新数据,请执行以下操作:

INSERT IGNORE INTO mtlog (columnname1, columnname2, ...) 
VALUES (...) ON DUPLICATE KEY UPDATE
 SET non_duplicate_columnname = '$value1', non_duplicate_columnname2 = '$value2'

请参阅:
http://dev.mysql.com/doc/refman/5.5/en/alter-table.html
http://dev.mysql.com/doc/refman/5.5/en/insert.html
http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html