MySQL 触发器 - 在插入时创建随机哈希键

标签 mysql hash triggers

我正在尝试在 MYSQL 插入上创建一个触发器,如果​​插入的字段具有空哈希键,它将生成一个随机的 32 个字符的哈希键。

我试过以下方法:

CREATE TRIGGER `external_contacts_hash_auto_create` BEFORE INSERT ON `external_contacts`

FOR EACH ROW BEGIN SET NEW.hash_key = 

concat(
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
                        substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
                        substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
                        substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@lid)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
                        substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed:=round(rand(@seed)*4294967296))*36+1, 1),
          substring('abcdefghijklmnopqrstuvwxyz0123456789', rand(@seed)*36+1, 1)

) WHERE OLD.hash_key = null;
END

但是生成的 hashkey 总是相同的,没有什么是随机的。

最佳答案

你的整个触发器充满了错误。您永远不会为 @lid@seed 初始化或分配值。

号码 4294967296 的用途是什么?这对我来说完全没有意义。

声明 SET whatever WHERE whatever; 在语法上是错误的。这里没有 WHERE 子句。

当您与 NULL 比较时,它要么是 IS NULL 要么是 IS NOT NULL

BEFORE INSERT 触发器中没有 OLD 行。

不要让我开始谈论你的编码风格重复相同的语句 32 次。

看来你只是想要一个随机字符串。您可以改用这样的东西:

CREATE TABLE ins_hash (id int auto_increment primary key, hash_key char(32));

DELIMITER $$
CREATE TRIGGER trg_ins_hash BEFORE INSERT ON ins_hash
FOR EACH ROW 
BEGIN

    SET @string := 'abcdefghijklmnopqrstuvwxyz0123456789';
    SET @i := 1;
    SET @hash := '';

    WHILE (@i <= 32) DO
        SET @hash := CONCAT(@hash, SUBSTRING(@string, FLOOR(RAND() * 36 + 1), 1));
        SET @i := @i + 1;
    END WHILE;

    SET NEW.hash_key := @hash;

END$$
DELIMITER ;

INSERT INTO ins_hash (id) VALUES (NULL);
INSERT INTO ins_hash (id) VALUES (NULL), (NULL);

SELECT * FROM ins_hash;
+----+----------------------------------+
| id | hash_key                         |
+----+----------------------------------+
|  1 | tl84mhbtuhng50di5y132sitcyg54wt6 |
|  2 | 3otr42mqfq42q8m7vgec8u9ihk6woer8 |
|  3 | ph0dkgbv4r42q47cv18vbpa4efldw2de |
+----+----------------------------------+
3 rows in set (0.00 sec)

关于MySQL 触发器 - 在插入时创建随机哈希键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40584660/

相关文章:

android - AdMob 的测试设备 ID 是哪种哈希类型?

sql-server - 如何阻止数据库部署删除服务器触发器?

mysql - 创建一个获取行及其相邻行的查询

mysql - 从 shell 脚本将值插入到 mysql

php - Carbon 将 Iso 8601 字符串解析为 UTC 日期并将其记录到数据库

mysql - PowerShell 不会逐行迭代 MySQL 结果 - 为什么?

c - 二进制哈希函数族

java - 如何使用 MD5 转换密码并根据有效凭据检查用户的凭据?

mySQL 触发错误代码 1064

Jenkins 必须在 Windows 上触发构建吗?