将具有ULID的列追加到现有MySQL表

fdbelqdn  于 2023-03-07  发布在  Mysql
关注(0)|答案(1)|浏览(151)

我正在尝试将一个带有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());

然而,我需要用一个查询来完成它,这可能吗?

uelo1irk

uelo1irk1#

尽管您在最终表达式中使用s_hex的值3次,并且即使它包含随机值,您也可以在最终公式中重复使用s_hex的公式3次:

UPDATE mytable SET new_id = REPLACE(REPLACE(REPLACE( ...
  LPAD(CONV(SUBSTRING(  LPAD(HEX(..., 32, '0')  , 1, 2), 16, 32), 2, '0'),
  LPAD(CONV(SUBSTRING(  LPAD(HEX(..., 32, '0')  , 3, 15), 16, 32), 12, '0'), 
  LPAD(CONV(SUBSTRING(  LPAD(HEX(..., 32, '0')  , 18, 15), 16, 32), 12, '0')
), 'V', 'Z')..., 'I', 'J');

random_bytes()-函数将为3个部分返回不同的值,但由于没有重叠,并且所有随机值都有效,因此整个结果仍然有效(例如如果子串2使用随机串ABCDEF的前2个字母并且子串3使用随机串123456的后4个字母,这与原始随机串是AB3456是一样的)。
最后一个表达式很长,看起来不太好看,但是可以使用。如果你愿意(并且有时间),你可以进一步简化它,例如SUBSTRING(s_hex, 1, 2)在未来10年是01,之后是02,所以你不需要使用完整的表达式。

相关问题