MySQL中ALTER TABLE新增列时如何从其他列取值填充历史数据
MySQL实现新增列从已有字段批量填充的方案
你编写的ALTER语句无法生效是因为MySQL的列默认值仅支持常量或特定内置函数,不支持引用同表其他字段,因此无法通过设置DEFAULT的方式直接关联
is_ok字段值。
以下分两种常见场景给出可行方案:
场景1:仅需一次性填充历史数据,后续points字段可独立修改
- 第一步:新增
points字段
ALTER TABLE `MyTable` ADD `points` INT(16);
- 第二步:批量更新历史数据,MySQL中布尔类型本质为TINYINT,真值为1、假值为0,可直接赋值关联:
UPDATE `MyTable` SET `points` = `is_ok`;
如果需要明确区分逻辑可以用IF函数,效果和上述写法一致:
UPDATE `MyTable` SET `points` = IF(`is_ok`, 1, 0);
场景2:需要points字段永远和is_ok值自动同步,无需手动维护
如果你的MySQL版本≥5.7,可以使用生成列实现自动同步,STORED参数表示生成的值会实际存储在表中,适合需要频繁查询该字段的场景:
ALTER TABLE `MyTable` ADD `points` INT(16) GENERATED ALWAYS AS (`is_ok`) STORED;
如果不需要持久化存储、仅需要查询时动态计算,可以把STORED替换为VIRTUAL,不占用额外存储空间。
内容的提问来源于stack exchange,提问作者asdru
相关产品推荐
相关产品推荐

