我创建了一个mysql数据库表,其中包含两个字段serial # (primary key, auto increment)
和version.
我想要做的是对我对此数据库执行的每个插入操作,将version
值设置为1,然后将2,3,4,5再次设置为1。
我可以想象通过在插入之前拉出表中的最后一个条目来做到这一点。我怎样才能做到这一点?有没有更简单的方法?我正在使用PHP。
答案 0 :(得分:2)
您可以使用内置的MySQL触发器:http://dev.mysql.com/doc/refman/5.0/en/triggers.html
您可以创建数据库触发器来执行您想要的操作。语法是这样的:
CREATE
TRIGGER `event_name` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `database`.`table`
FOR EACH ROW BEGIN
-- trigger body
-- this code is applied to every
-- inserted/updated/deleted row
END;
修改强>
触发器直接在数据库端创建。您可以使用MySQL CLI或PHPMyAdmin进行连接以运行查询。
此外,懒惰的解决方案可能是使用类似于aaaaaa123456789建议的查询:
SELECT (
(SELECT version FROM <table name here> ORDER BY id DESC LIMIT 0, 1) % 5
) + 1 as version;
模数(%)运算符返回两个数字的其余部分,可用于限制增量。
例:
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
5 % 5 = 0
7 % 5 = 2
10 % 5 = 0
PS。:我没有尝试过这个查询,因为我不在我的开发机器上,但是从我的脑海里开始工作。
答案 1 :(得分:1)
最简单的方法是,正如rcdmk建议的那样,在数据库本身中编写一个触发器,用相应的值更新版本字段。
如果由于任何原因触发器刚出窗口,那么您可以SELECT version FROM <table name here> ORDER BY id DESC LIMIT 0, 1
来获取最后一个值。事实上,括号(如在括号中)和1 + (query here)
作为插入值发送INSERT
可能是最好的方法,因为它可以避免竞争条件。
答案 2 :(得分:0)
$next_increment = 0;
$qShowStatus = "SHOW TABLE STATUS LIKE 'yourtable'";
$qShowStatusResult = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );
$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];