我正在使用mysql / php。
我的表看起来像
id (int autoincrement)
voucher(varchar 25)
我正在生成代码为的代金券代码:
使用php执行此操作的一个明显问题是我必须执行select,获取下一个自动增量值,计算代码,插入,此时可以插入另一行。
我想做的是,
做insert into vouchers (voucher) value('64352')
并让它产生剩下的我。
我该怎么做?功能/触发?
答案 0 :(得分:1)
如果您使用InnoDB,一个简单的解决方法就是使用您现有的代码并将其包装在MySQL事务中。即伪代码:
mysql_query("START TRANSACTION");
# get next autoincrement value into: $next
# do your INSERT query
# get the actual last inserted ID into: $actual
if ($next === $actual) {
mysql_query("COMMIT");
} else {
mysql_query("ROLLBACK");
# and raise an Exception or return an error
}
修改/ ADD:强>
既然你提到了触发器,我就调查了它并相信它是可行的。几个问题。
从触发器中访问“下一个自动增量ID”...我不知道这样做的“好”方法。在INSERT查询中,您只能访问NEW而不是OLD(现有行)值(请参阅Trigger syntax)。我在示例中要做的只是在服务器上维护一个单独的计数器@vcount。要将此值初始化为当前ID,您只需执行“SET @vcount = 42;”
Luhn算法。您必须将其实现为SQL函数。 Here's SQL中的Luhn验证器,您可以使用它。或者,你可以使用像MD5这样的本机MySQL函数来散列/校验和(如果你需要一个简短的凭证代码,只使用前X个字符)。在任何情况下你都需要制作一个哈希函数...我将在下面使用“Luhn”。
无论如何,这是触发器的样子:
delimiter //
CREATE TRIGGER make_voucher_code BEFORE INSERT ON vouchers
FOR EACH ROW
BEGIN
SET @vcount = @vcount + 1;
SET NEW.voucher = CONCAT(
NEW.voucher,
CAST(@vcount AS CHAR),
Luhn(CONCAT(NEW.voucher, CAST(@vcount AS CHAR))));
END;
//
delimeter ;
然后,在您的INSERT中,您可以在查询中添加'64352',正如您所建议的那样。触发器将附加其余部分。
就个人而言,除非你或其他人能更好地解决autoincrement / @vcount问题,否则我仍然会更喜欢做MySQL事务,这比保持所有原子性并将所有应用程序代码保存在PHP中做得更好。
答案 1 :(得分:0)
或者使用值0进行插入,然后获取插入ID,计算值并更新记录。