如何在 MySQL 中为行保留一个计数器

Posted

技术标签:

【中文标题】如何在 MySQL 中为行保留一个计数器【英文标题】:How to keep a counter for rows in MySQL 【发布时间】:2012-02-19 02:40:38 【问题描述】:

所以我有一个表,我们称之为 foo,它的每一行都有一堆信息,加上一个计数。我想要的是,每次在表上进行插入时,每行的计数变量都应该增加 1。问题是我会有很多相同的行进入(这就是我需要计数的原因)所以我正在执行 IGNORE 命令,因为我不希望我的表中有大量重复项。

所以我的插入是这样的:

INSERT IGNORE INTO foo (blah, blah, count) 
VALUES ("blah", "blah", 1);

现在要进行更新,我正在做一个触发器:

CREATE TRIGGER fooCount BEFORE INSERT ON foo
FOR EACH ROW
BEGIN
  IF (new.blah1=new.blah2 and new.blah1=new.blah2) THEN
    SET new.count=new.count + 1;
  END IF;
END;

但是,这似乎不起作用。有没有人对如何更好地做到这一点有任何其他建议或帮助?

【问题讨论】:

你的触发器有new.blah1=new.blah2两次。这是一个错字吗?如果不是,你打算写什么? 【参考方案1】:

我不确定是否可以在 mysql 中工作(编辑)。

尝试像这样构建sql:

UPDATE Foo
    SET count = count + 1
    WHERE blah1 = 'blah' AND blah2 = "blah2"


IF @@ROWCOUNT = 0 
   BEGIN
      INSERT INTO foo(...) values(...)
   END

您需要修改我的代码才能在 mysql 中工作。在这里您可以阅读您需要的所有信息:

http://dev.mysql.com/doc/refman/5.0/en/if-statement.html

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_row-count

【讨论】:

在考虑了这么久之后,我想知道我的查询是否比下面那个人的更好。我不确定 mysql 中的并发性是如何工作的——您可能需要使用表/行锁定或诸如带有精确时间戳的“队列”之类的东西来使该计数器正确。 我实际上能够弄清楚的是使用这个: INSERT INTO foo(...) values(...) ON DUPLICATE KEY UPDATE count=count+1 这实际上完全处理了所有事情.即使这实际上不是原子的(我不确定它是否是原子的)也没关系,因为我不是在寻找一个完全准确的答案,被一些人拒绝应该不是问题。感谢您的帮助!【参考方案2】:

只需在插入前执行一个简单的查询即可获得最后一个 Count 值,然后您的插入应该如下所示:

INSERT IGNORE INTO foo (blah, blah, count) VALUES ("blah", "blah", "$lastcount+1");

【讨论】:

这是个坏主意,因为两个用户可以同时插入数据。 我同意,但这没有说明,所以我只是假设他是唯一这样做的人:D 这行不通,因为我不是唯一做插入的人。这也会严重降低我的系统速度。

以上是关于如何在 MySQL 中为行保留一个计数器的主要内容,如果未能解决你的问题,请参考以下文章

mysql 计数器 计算不重复

如何在 C++ 中为共享计数器实现简单的比较和交换

如何根据计数器应用多个条件,并使用 pandas 和 python 在 excel 中为每个条件提供输出?

如何在 iOS 10 中为推送通知设置徽章计数?

如何在sql中为记录添加计数

如何获得解码/未透视行的唯一计数(列到行)