MySQL能否按列位置而非列名编写UPDATE查询语句?
结论
MySQL 原生语法不支持直接通过列位置指代列名编写 WHERE 条件,SQL 标准本身也没有定义按列位置筛选的语法规则。但可以通过以下两种不需要单独发起查询拉取列名的方案实现需求:
方案1:单请求内嵌套列名查询+预处理语句
你可以在同一次数据库请求中嵌套元数据查询逻辑,通过预处理语句动态生成并执行 UPDATE 语句,不需要单独发起一次请求获取列名:
-- 先查询指定位置的列名,位置从1开始计数,这里1代表第一列 SET @target_col = ( SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'sale' AND ORDINAL_POSITION = 1 ); -- 拼接生成最终要执行的UPDATE语句 SET @exec_sql = CONCAT('UPDATE sale SET sale_order = ''123456789'' WHERE ', @target_col, ' = 2'); -- 预处理并执行语句 PREPARE stmt FROM @exec_sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
- 注意事项:该方案需要你的数据库账号拥有
INFORMATION_SCHEMA的查询权限,且你使用的数据库客户端/连接配置支持多语句执行。
方案2:应用层缓存表结构映射
如果你的业务中sale表的结构不会频繁变更,可以在应用启动时一次性拉取所有用到的表的「列位置-列名」映射关系,缓存到应用内存中。后续需要按位置筛选时,直接从缓存中读取对应列名拼接SQL即可,全程不需要额外发起数据库请求。
不建议的实现方式
不要尝试用依赖SELECT返回列顺序的奇淫技巧实现,这类写法可读性极低,一旦后续表结构变更(新增/删除列、调整列顺序)会直接导致逻辑出错,排查成本极高。
内容的提问来源于stack exchange,提问作者jdias
相关产品推荐
相关产品推荐

