0

我创建了一个 mysql 数据库表,它有两个字段,serial # (primary key, auto increment)并且version.

我想要做的是对于我对该数据库执行的每次插入,将version值设置为 1,然后设置为 2、3、4、5,然后再次返回到 1。

我可以想象通过在插入之前拉出表中的最后一个条目来做到这一点。我怎样才能做到这一点?有没有更简单的方法?我正在使用 PHP。

4

3 回答 3

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.:我没有尝试过这个查询,因为我不在我的开发机器上,但在我看来它有效。

于 2013-02-11T02:59:36.600 回答
1

正如 rcdmk 建议的那样,最简单的方法是在数据库本身中编写一个触发器,用相应的值更新版本字段。

如果触发器出于某种原因刚刚超出窗口,那么您可以只SELECT version FROM <table name here> ORDER BY id DESC LIMIT 0, 1获取最后一个值。实际上,将其括起来(如将其放在括号之间)并将其作为插入值发送1 + (query here)INSERT查询可能是最好的方法,因为它避免了竞争条件。

于 2013-02-11T03:02:34.390 回答
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']; 
于 2013-02-11T03:03:11.487 回答