You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 22:35:01