我正在尝试将一个带有ULID的列追加到一个现有的MySQL表中。我知道如何使用一个函数和一个更新查询来完成此操作:
delimiter //
DROP FUNCTION IF EXISTS ulid//
CREATE FUNCTION ulid () RETURNS CHAR(26) DETERMINISTIC
BEGIN
DECLARE s_hex CHAR(32);
SET s_hex = LPAD(HEX(CONCAT(UNHEX(CONV(ROUND(UNIX_TIMESTAMP(CURTIME(4))*1000), 10, 16)), RANDOM_BYTES(10))), 32, '0');
RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(CONCAT(LPAD(CONV(SUBSTRING(s_hex, 1, 2), 16, 32), 2, '0'), LPAD(CONV(SUBSTRING(s_hex, 3, 15), 16, 32), 12, '0'), LPAD(CONV(SUBSTRING(s_hex, 18, 15), 16, 32), 12, '0')), 'V', 'Z'), 'U', 'Y'), 'T', 'X'), 'S', 'W'), 'R', 'V'), 'Q', 'T'), 'P', 'S'), 'O', 'R'), 'N', 'Q'), 'M', 'P'), 'L', 'N'), 'K', 'M'), 'J', 'K'), 'I', 'J');
END//
delimiter;
UPDATE mytable SET new_id=(SELECT ulid());
然而,我需要用一个查询来完成它,这可能吗?
1条答案
按热度按时间uelo1irk1#
尽管您在最终表达式中使用
s_hex
的值3次,并且即使它包含随机值,您也可以在最终公式中重复使用s_hex
的公式3次:random_bytes()
-函数将为3个部分返回不同的值,但由于没有重叠,并且所有随机值都有效,因此整个结果仍然有效(例如如果子串2使用随机串ABCDEF
的前2个字母并且子串3使用随机串123456
的后4个字母,这与原始随机串是AB3456
是一样的)。最后一个表达式很长,看起来不太好看,但是可以使用。如果你愿意(并且有时间),你可以进一步简化它,例如
SUBSTRING(s_hex, 1, 2)
在未来10年是01
,之后是02
,所以你不需要使用完整的表达式。