mySQL表上的唯一字段 - 生成促销代码

时间:2013-01-21 03:14:07

标签: mysql

我正在开发一个PHP脚本,我有一个这样的表:

TABLE_CODE
   code  varchar  8
   name  varchar  30

此代码列必须是使用从A到Z的随机字母和从0到9的字符的代码,并且必须是唯一的。全部大写。像

这样的东西
A4RTX33Z

我已经创建了一个使用PHP生成此代码的方法。但这是一项密集型任务,因为我必须查询数据库以查看生成的代码在继续之前是否是唯一的,并且该表可能包含大量记录。

因为我知道mySQL是一大堆技巧但现在还没有关于它的高级知识,我想知道是否有一些机制可以在表中构建以在每次创建新记录时运行脚本(或其他东西)该表用唯一值填充代码列。

感谢


编辑:我想知道是否有一种方法可以即时创建代码,因为记录被添加到表中并且该代码是唯一的。

2 个答案:

答案 0 :(得分:1)

在代码列上添加UNIQUE约束是您需要做的第一件事。然后,要插入代码,我会写一个像这样的小循环:

// INSERT IGNORE will not generate an error if the code already exists
// rather, the affected rows will be 0.
$stmt = $db->prepare('INSERT IGNORE INTO table_code (code, name) VALUES (?, ?)');
$name = 'whatever name';
do {
    $code = func_to_generate_code();
    $stmt->execute(array($code, $name));
} while (!$stmt->rowCount()); // repeat until at least one row affected

随着表的增长,循环次数可能会增加,所以如果你认为它应该只尝试三次,你可以将它添加为循环条件并在发生错误时抛出错误。

顺便说一句,我建议使用事务来确保代码生成后是否发生错误,回滚将确保代码被删除(可以重复使用)。

答案 1 :(得分:0)

最好在SQL中生成这些代码。这是8个字符的随机“促销代码生成器”:

INSERT IGNORE INTO 
TABLE_CODE(name, code)
VALUES(
    UPPER(SUBSTRING(MD5(RAND()) FROM 1 FOR 8)), -- random 8 characters fixed length
    'your code name'
)

在@JW建议的UNIQUE字段上添加code,在PHP中添加一些错误处理,因为有时生成的值可能不是UNIQUE,MySQL会在那种情况下引发错误