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

如何修复添加计算列的MySQL表修改脚本报错问题

问题分析与修正方案

问题根源

报错Error Code: 1175是因为MySQL Workbench默认开启了安全更新模式(Safe Update Mode),这个模式的核心限制是:UPDATE/DELETE语句的WHERE子句必须引用主键或唯一索引列,目的是防止用户误操作更新/删除全表数据。

你的UPDATE语句中,WHERE条件仅使用了country_code和mobile字段,如果这两个字段不是主键或索引列,就会触发该安全限制。

修正方法(三种可选)

方法1:临时关闭当前会话的安全更新模式

在执行UPDATE语句前,先执行以下命令临时禁用安全模式,执行完后可按需重新开启:

-- 临时关闭安全更新模式
SET SQL_SAFE_UPDATES = 0;

-- 执行原UPDATE语句
UPDATE schema.clients
SET phone = Concat(trim(cast(country_code as char(10))), trim(cast(mobile as char(20))) )
WHERE country_code is not null and mobile is not null;

-- 可选:重新开启安全更新模式
SET SQL_SAFE_UPDATES = 1;

方法2:修改UPDATE语句,让WHERE子句包含键列

从你创建索引idx_phone包含id的操作推断,id应该是表的主键。只需在WHERE条件中加入主键相关判断,让WHERE引用键列即可:

UPDATE schema.clients
SET phone = Concat(trim(cast(country_code as char(10))), trim(cast(mobile as char(20))) )
WHERE id IS NOT NULL AND country_code is not null and mobile is not null;

方法3:永久关闭Workbench的安全更新模式

按报错提示操作:

  • 打开Workbench的Preferences(偏好设置)
  • 进入SQL Editor选项卡
  • 取消勾选Safe Updates选项
  • 断开并重新连接数据库,设置生效

额外优化:改用MySQL生成列(推荐)

你原本的需求是创建合并country_code和mobile的计算列,其实MySQL支持生成列(Generated Column),无需手动执行UPDATE,系统会自动维护该字段的值,更高效且避免数据不一致:

ALTER TABLE schema.clients 
ADD phone VARCHAR(50) AS (
    Concat(trim(cast(country_code as char(10))), trim(cast(mobile as char(20))) )
) STORED;

CREATE UNIQUE INDEX idx_phone ON schema.clients(id, phone);
  • STORED表示该列的值会存储在表中,查询时直接读取;如果用VIRTUAL则是查询时计算,可根据实际场景选择。

内容的提问来源于stack exchange,提问作者Simple Fellow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:07:14