【问题标题】:Unique fields on mySQL table - generating promo codesmySQL 表上的唯一字段 - 生成促销代码
【发布时间】:2013-01-21 03:14:06
【问题描述】:

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

TABLE_CODE
   code  varchar  8
   name  varchar  30

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

A4RTX33Z

我创建了一种使用 PHP 生成此代码的方法。但这是一项繁重的任务,因为在继续之前我必须查询数据库以查看生成的代码是否唯一,并且该表可能有很多记录。

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

谢谢


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

【问题讨论】:

  • 为什么要像这样使用完全随机的code 字段?
  • 因为这将是用于识别给定用户促销活动中某些元素的代码。

标签: mysql


【解决方案1】:

最好在 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 的建议在code 字段上添加UNIQUE,并在PHP 中进行一些错误处理,因为有时生成的值可能不是UNIQUE,在这种情况下MySQL 会引发错误。

【讨论】:

  • 但这需要检查随机值是否已经存在。
  • 如果代码是唯一的并且生成的代码已经存在会怎样?
  • @DesperateDeveloper 我添加了有关“已经存在”的信息。你在 PHP 中使用的是 PDO 还是 mysqli?
  • 查看@Jack 的答案并将我的 SQL 放在那里。这将是完整的答案:)
  • @DesperateDeveloper 附带说明一下,如果您让 SQL 生成代码,您仍然需要 PHP(或存储过程)来处理它已经存在的情况;最重要的是,您将无法访问 PHP 内部生成的代码,如果您以后需要引用它可能会导致问题。
【解决方案2】:

在代码列上添加 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

随着表格的增长,循环次数可能会增加,因此如果您认为它应该只尝试 3 次,您可以将其添加为循环条件,如果发生这种情况则抛出错误。

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

【讨论】:

  • 您可以在回答中使用我的 SQL。这将是完整的解决方案。
  • @Kamil 不是,因为如果代码是用 PHP 生成的,以后可以使用;但是如果代码是在 MySQL 中生成的,除了再次查询数据库之外,没有其他办法知道代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2018-07-24
相关资源
最近更新 更多