用于保持INSERT已存在行的尝试计数的列

时间:2012-07-15 03:58:31

标签: php mysql sql count primary-key

我正在尝试创建一个列,并使其计算用户进行的插入尝试次数。

一个例子可以让事情变得更加清晰:

+-------+----------------------------------+--------------+
| text  |            md5                   | insert_times | 
+-------+----------------------------------+---------+----+
| 123   | 202cb962ac59075b964b07152d234b70 |     834      |  
| abc   | 900150983cd24fb0d6963f7d28e17f72 |     923      |      
+-------+----------------------------------+--------------+

其中text是主键。
每当用户尝试插入123(使用INSERT IGNORE未收到错误消息,因为123已存在)时,insert_times会增加1,并保持跟踪在表中插入已存在的文本的尝试次数。

关于如何制作它的任何想法?
我无法创建触发器,因为我的db主机(godaddy)不允许触发器。
如果无法在mysql中执行,我可以在php的帮助下将其删除吗?

3 个答案:

答案 0 :(得分:2)

要在一个简单的查询中执行此操作,只需使用MySQL中的ON DUPLICATE KEY UPDATE函数即可。有了这个,您只需执行INSERT,然后执行需要在“重复”行中更新的内容。例如:

INSERT INTO tbl (text, md5, insert_times) VALUES ('abc', {MD5}, 0}
ON DUPLICATE KEY UPDATE insert_times+1;

然而,我个人更喜欢PHP方法,因为在我的大多数查询中,事情通常不像简单的更新那么简单:

$res = mysql_query(sprintf("SELECT text FROM tbl WHERE text = '%s'", $text));
if (mysql_num_rows($res) != 0)
{
    mysql_query(sprintf("UPDATE tbl SET insert_times+1 WHERE text = '%s'", $text);
}
else
}
    mysql_query(sprintf("INSERT INTO tbl SET text = '%d', md5 = '%s'", $text, $hash);
}

如果需要,此方法还有更多空间来触发其他事件/功能。

答案 1 :(得分:1)

检查该特定键的表中是否已存在该记录,如果是,则将insert_times值更新为insert_times+1; ,否则创造一个新纪录。

答案 2 :(得分:0)

您可以在脚本中放置一些逻辑,以便在尝试插入行之前检查该行是否存在。如果它不存在,请执行INSERT查询。如果是,则增加insert_times字段。

您还可以保留一个单独的insert_attempts表,该表没有唯一性约束。对于每次插入行的尝试,您将执行两个查询:您现在正在执行的查询,以及一个insert_attempts查询。 insert_attempts可以插入一个新行,你可以COUNT()具有相关ID的行,或者它可以只检查与该ID相关联的数字并更新它。