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

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及以下)

低版本不支持生成列,需要手动新增普通列、更新历史数据,再通过触发器维护后续数据一致性:

  1. 新增普通存储列
ALTER TABLE info ADD COLUMN combine_id BIGINT UNSIGNED COMMENT 'ids与location拼接得到的整数';
  1. 初始化历史数据
UPDATE info SET combine_id = CAST(CONCAT(ids, location) AS UNSIGNED);
-- 有补零需求就替换成对应带LPAD的逻辑
  1. 创建触发器自动维护后续新增、修改的数据
-- 新增数据时自动填充拼接值
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:57:14