如何用单条SQL语句为现有MySQL表添加ULID列?
如何用单条SQL为MySQL表添加并填充ULID列?
可行,你可以直接通过ALTER TABLE语句将添加列、生成ULID的逻辑整合在一起,无需依赖自定义函数或单独的UPDATE操作。前提是你的MySQL版本为8.0.13+(该版本开始支持表达式作为列默认值,且RANDOM_BYTES()函数可用)。
单条SQL实现代码
ALTER TABLE mytable ADD COLUMN new_id CHAR(26) NOT NULL DEFAULT ( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( CONCAT( LPAD(CONV(SUBSTRING(LPAD(HEX(CONCAT(UNHEX(CONV(ROUND(UNIX_TIMESTAMP(CURTIME(4))*1000), 10, 16)), RANDOM_BYTES(10))), 32, '0'), 1, 2), 16, 32), 2, '0'), LPAD(CONV(SUBSTRING(LPAD(HEX(CONCAT(UNHEX(CONV(ROUND(UNIX_TIMESTAMP(CURTIME(4))*1000), 10, 16)), RANDOM_BYTES(10))), 32, '0'), 3, 15), 16, 32), 12, '0'), LPAD(CONV(SUBSTRING(LPAD(HEX(CONCAT(UNHEX(CONV(ROUND(UNIX_TIMESTAMP(CURTIME(4))*1000), 10, 16)), RANDOM_BYTES(10))), 32, '0'), 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' ) );
说明
- 这条语句会一次性完成添加
new_id列和为所有现有行填充ULID值两个操作,不需要额外执行UPDATE。 - 代码中把你原自定义函数
ulid()的逻辑完全展开为内置函数表达式,确保生成的字符串符合ULID的base32编码规范(替换了ULID禁用的字母)。 - 如果需要后续插入新行时自动生成ULID,这个默认值会继续生效,无需额外处理。
内容的提问来源于stack exchange,提问作者Medical physicist
相关产品推荐
相关产品推荐

