我正在尝试在 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/