如何检查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";}
答案 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