如何在 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 中为行保留一个计数器的主要内容,如果未能解决你的问题,请参考以下文章