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

SQL中GENERATED ALWAYS生成列问题:插入时如何指定refer_code?

解决MySQL生成列GENERATED ALWAYS的插入/更新报错问题

这个3105错误的本质很明确:你用GENERATED ALWAYS定义的生成列,数据库完全不允许任何手动赋值操作——不管是INSERT还是UPDATE,只要你显式指定了refer_code的值,就会触发这个错误。

核心原因

GENERATED ALWAYS的语义就是“始终由数据库自动生成”,相当于给这个列加了强制锁,完全接管了值的生成逻辑,用户没有干预权限。

两种解决方案

方案1:完全遵循生成列规则(推荐)

插入数据时不要在语句里提及refer_code列,让数据库按照你定义的生成表达式自动计算值。

举个例子,假设你的表结构是:

CREATE TABLE `group` (
  `id` INT AUTO_INCREMENT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL,
  `refer_code` VARCHAR(20) GENERATED ALWAYS AS (CONCAT('GRP-', LPAD(id, 3, '0'))) STORED
);

正确的插入语句应该是:

INSERT INTO `group` (name) VALUES ('前端开发组');

执行后,数据库会自动根据id生成类似GRP-001的refer_code值,完全不需要你手动指定。

方案2:修改生成列规则,允许手动赋值(特殊场景用)

如果因为数据迁移、历史数据导入等场景,必须手动设置refer_code的值,你可以把GENERATED ALWAYS改成GENERATED BY DEFAULT。这个关键字的语义是“默认由数据库生成,但用户可以手动覆盖”。

修改表结构的语句示例:

ALTER TABLE `group` 
MODIFY COLUMN refer_code VARCHAR(20) 
GENERATED BY DEFAULT AS (CONCAT('GRP-', LPAD(id, 3, '0'))) STORED;

修改后,你既可以像方案1那样不指定refer_code让数据库自动生成,也可以手动指定值插入:

INSERT INTO `group` (name, refer_code) VALUES ('临时测试组', 'GRP-TEMP001');

小提示

注意group是MySQL的保留关键字,创建表或者写SQL时最好用反引号`把表名括起来,避免额外的语法错误。

内容的提问来源于stack exchange,提问作者Kumar Roshan Mehta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:41:04