MySQL中如何将两个int类型字段的值拼接为一个整数
MySQL实现info表拼接整数字段方案
方案1:优先使用生成列(支持MySQL 5.7及以上版本,免维护一致性好)
直接通过DDL新增存储型生成列,MySQL会自动填充历史数据,后续增改数据时也会自动同步计算值,无需额外维护:
-- 新增自动拼接的存储列 ALTER TABLE info ADD COLUMN combine_id BIGINT UNSIGNED GENERATED ALWAYS AS (CAST(CONCAT(ids, location) AS UNSIGNED)) STORED COMMENT 'ids与location拼接得到的整数'; -- 可选:因为原字段组合唯一,可以直接给该列加唯一索引替代原组合唯一约束,查询效率更高 ALTER TABLE info ADD UNIQUE KEY uk_combine_id (combine_id);
注意:如果业务要求location按固定长度拼接(比如固定2位,不足时前面补0,例location值为2时拼接结果为1234502而非123452),将列生成规则替换为
CAST(CONCAT(ids, LPAD(location, 2, '0')) AS UNSIGNED)即可,固定长度按实际业务调整。
方案2:低版本MySQL兼容方案(5.6及以下)
低版本不支持生成列,需要手动新增普通列、更新历史数据,再通过触发器维护后续数据一致性:
- 新增普通存储列
ALTER TABLE info ADD COLUMN combine_id BIGINT UNSIGNED COMMENT 'ids与location拼接得到的整数';
- 初始化历史数据
UPDATE info SET combine_id = CAST(CONCAT(ids, location) AS UNSIGNED); -- 有补零需求就替换成对应带LPAD的逻辑
- 创建触发器自动维护后续新增、修改的数据
-- 新增数据时自动填充拼接值 CREATE TRIGGER trg_info_insert BEFORE INSERT ON info FOR EACH ROW SET NEW.combine_id = CAST(CONCAT(NEW.ids, NEW.location) AS UNSIGNED); -- 修改ids或location时自动更新拼接值 CREATE TRIGGER trg_info_update BEFORE UPDATE ON info FOR EACH ROW SET NEW.combine_id = CAST(CONCAT(NEW.ids, NEW.location) AS UNSIGNED);
字段类型选择说明
不要用INT类型存储拼接结果:普通INT有符号最大值为2147483647(共10位),两个INT字段拼接后最长可达20位,会超出INT存储范围导致溢出。选用BIGINT UNSIGNED类型最大支持20位无符号整数,完全覆盖所有拼接场景,不会出现溢出问题。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

