【问题标题】:Auto-generate unique alphanumeric in DB?在数据库中自动生成唯一的字母数字?
【发布时间】:2011-03-16 02:16:26
【问题描述】:

我的数据库中有 3 列:电子邮件(主要)、unique_code、时间戳

  1. 用户输入他们的电子邮件地址并将其添加到数据库中。 每次用户这样做时,我希望该行中的“unique_code”列自动生成唯一的 5 位字母数字(0-9,A-Z)代码。我希望数据库来完成这方面的所有工作,但我不知道该怎么做。

  2. 接下来我需要向用户显示该代码(与他们的行相对应的代码)。

我该如何处理这两者?

谢谢!


字段类型归类属性 Null 默认额外操作
电子邮件 varchar(64) utf8_unicode_ci 否 无
unique_code varchar(64) utf8_unicode_ci 否 无
更新时间戳 CURRENT_TIMESTAMP 无 CURRENT_TIMESTAMP

索引
PRIMARY BTREE 是 否 email 7 A

编辑:(完整代码)

<?php

require "includes/connect.php";

$msg = '';

if($_POST['email']){

    // Requested with AJAX:
    $ajax = ($_SERVER['HTTP_X_REQUESTED_WITH']  == 'XMLHttpRequest');

    try{
        if(!filter_input(INPUT_POST,'email',FILTER_VALIDATE_EMAIL)){
            throw new Exception('Invalid Email!');
        }

        $mysqli->query("INSERT INTO coming_soon_emails
                        SET email='".$mysqli->real_escape_string($_POST['email'])."'");

        if($mysqli->affected_rows != 1){
            throw new Exception('This email already exists in the database.');
        }

        if($ajax){
            die('{"status":1}');
        }

        $msg = "Thank you!";
        $mysqli->query("INSERT INTO coming_soon_emails VALUES('email', SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5), UNIX_TIMESTAMP())");
echo "Something went wrong:" . $mysqli->error;
    }
    catch (Exception $e){

        if($ajax){
            die(json_encode(array('error'=>$e->getMessage())));
        }

        $msg = $e->getMessage();        
    }
}
?>


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>example</title>

<link rel="stylesheet" type="text/css" href="css/styles.css" />

</head>

<body>

<div id="container">

    <form id="form" method="post" action="">
        <input type="text" id="email" name="email" value="<?php echo $msg?>" />
        <input type="submit" value="Submit" id="submitButton" />
    </form>

    <div id="thankyou">
    Thank you! <?php echo $unique_code;?></p>
    </div>


</div>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
<script src="js/script.js"></script>
</body>
</html>

【问题讨论】:

  • 这和your previous question有什么不同?
  • @Charles:因为我现在希望数据库来完成这项工作。

标签: php mysql


【解决方案1】:

code 列转换为自动递增的unique 索引:

ALTER TABLE mytable 
    ADD code INT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE;

然后将您的自动增量设置为从 5 位开始(例如 10000):

ALTER TABLE tbl AUTO_INCREMENT = 10000;

你也许可以把它合并成一个陈述,但我不是那么好:/

然后您可以使用LAST_INSERT_ID() 获取代码列值

【讨论】:

  • 是字母数字还是只有数字?
  • 数字,抱歉,我错过了该问题的“字母数字”部分。在这种情况下,我将使用 php rand() 生成一个 min=10000 和 max=99999 的数字,然后用随机字母(仍然使用 php)替换该结果中的随机数。然后查询数据库以查看它是否存在,如果不存在则插入,如果存在则冲洗并重复......我不知道数据库唯一的方法来做你想做的事。为什么必须是字母数字?
  • 这有点像短网址,我更喜欢字母数字。如果数据库执行随机工作也会更有效..而不是遍历整个列进行检查。
【解决方案2】:

大概是这样的

SELECT SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5) as id;

或者,你将如何使用它-

INSERT INTO `table` VALUES('email', SUBSTRING(MD5(UUID()),FLOOR(RAND()*25),5), UNIX_TIMESTAMP())

【讨论】:

  • @kavisiegel:抱歉,误读了该声明。谢谢,我现在就试试。
  • 不,它按照您指定的列的顺序排列。 'email' 进入电子邮件,SUBSTRING(UUID(),1,5) 进入代码,UNIX_TIMESTAMP() 进入时间戳。 (免责声明,这些可能不是 100% 唯一的。我不确定 uuid() 函数是如何工作的)
  • 这行不通。从 UUID() 中只取 5 个字符会产生太多冲突,前几个可能会共享相同的 5 个字符。
  • 是的,我想你是对的。我编辑了我原来的帖子来解决这个问题。
  • 我添加了:$mysqli->query("INSERT INTOcoming_soon_emails VALUES('email', SUBSTRING(UUID(),1,5), UNIX_TIMESTAMP())");并且不添加5位代码
【解决方案3】:

在 MySQL 中没有办法做到这一点,您需要一个计算列,并且它们不受支持。

您可以做的是有一个标准的自动递增整数,然后当您获取记录时将该整数(以 10 为基数)转换为某个基数的另一个整数(在您的情况下为 36 - 26 个字母 + 10 个数字)会给出一个字符串。

【讨论】:

  • 感谢您的建议。那么我究竟在数据库中调整了什么.. ALTER 一些东西?我必须在我的代码中进行哪些更改才能进行提取和转换?我会用我当前的表结构更新问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多