MySQL中如何让一列自动存储另一列的长度?
解决方案:自动存储列长度的两种实现方式
首先明确:不需要必须用触发器,MySQL 8.0.13及以上版本支持的**生成列(Generated Columns)**是更简洁的方案,你之前的DEFAULT方式报错是因为MySQL的列默认值不允许引用同表其他列的函数计算值。
错误原因
MySQL的列DEFAULT属性仅支持常量、NULL或少数系统内置函数(如CURRENT_TIMESTAMP),无法使用LENGTH(col1)这类依赖同表其他列的函数表达式,这就是你遇到1064语法错误的核心原因。
方案一:生成列(推荐,MySQL 8.0.13+)
生成列分为两种类型:
- STORED:值会被物理存储在磁盘上,查询时直接读取,适合频繁查询的场景
- VIRTUAL:值不存储,每次查询时动态计算,节省存储空间
执行以下SQL修改列即可:
-- 使用STORED类型(存储计算结果) ALTER TABLE Table.new_table MODIFY COLUMN length_of_col1 INT AS (LENGTH(col1)) STORED; -- 或者使用VIRTUAL类型(动态计算) ALTER TABLE Table.new_table MODIFY COLUMN length_of_col1 INT AS (LENGTH(col1)) VIRTUAL;
设置后,当col1的值插入或更新时,length_of_col1会自动同步更新,无需额外维护。
方案二:触发器(兼容MySQL 8.0.13以下版本)
如果你的MySQL版本较低,不支持生成列,就需要通过触发器实现。需要创建插入前和更新前两个触发器,确保每次数据变更时同步长度值:
-- 插入数据时自动计算col1长度 DELIMITER // CREATE TRIGGER trg_new_table_insert_col_len BEFORE INSERT ON Table.new_table FOR EACH ROW BEGIN SET NEW.length_of_col1 = LENGTH(NEW.col1); END // DELIMITER ; -- 更新数据时自动重新计算col1长度 DELIMITER // CREATE TRIGGER trg_new_table_update_col_len BEFORE UPDATE ON Table.new_table FOR EACH ROW BEGIN SET NEW.length_of_col1 = LENGTH(NEW.col1); END // DELIMITER ;
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

