难以插入

时间:2011-05-12 00:50:40

标签: php mysql database luhn

我正在使用mysql / php。

我的表看起来像

id (int autoincrement)  
voucher(varchar 25)

我正在生成代码为的代金券代码:

  • 1个随机数(例如64个)
  • 1个固定数字(例如352)
  • id字段的值(1,2,3,4,5 ......)
  • 1 checkdigit(luhn算法)。

使用php执行此操作的一个明显问题是我必须执行select,获取下一个自动增量值,计算代码,插入,此时可以插入另一行。

我想做的是,

insert into vouchers (voucher) value('64352')并让它产生剩下的我。

我该怎么做?功能/触发?

2 个答案:

答案 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:

既然你提到了触发器,我就调查了它并相信它是可行的。几个问题。

  1. 从触发器中访问“下一个自动增量ID”...我不知道这样做的“好”方法。在INSERT查询中,您只能访问NEW而不是OLD(现有行)值(请参阅Trigger syntax)。我在示例中要做的只是在服务器上维护一个单独的计数器@vcount。要将此值初始化为当前ID,您只需执行“SET @vcount = 42;”

  2. Luhn算法。您必须将其实现为SQL函数。 Here's SQL中的Luhn验证器,您可以使用它。或者,你可以使用像MD5这样的本机MySQL函数来散列/校验和(如果你需要一个简短的凭证代码,只使用前X个字符)。在任何情况下你都需要制作一个哈希函数...我将在下面使用“Luhn”。

  3. 无论如何,这是触发器的样子:

    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,计算值并更新记录。