SQL视图中禁用SELECT *,因其导致列结构不可控、跨平台不一致、列名冲突、解析失败、性能下降及工具链失效。
在 SQL 视图定义中写 SELECT * 不是语法错误,但等于主动放弃对输出结构的控制权——视图一旦创建,列名、列序、列数就该是确定的,而 * 让它变成运行时才决定的黑盒。
视图定义本身不存储字段元数据,只存 SQL 文本。当你用 SELECT * 创建视图后:
ALTER TABLE ADD COLUMN updated_at DATETIME,视图查询结果会立刻多出一列,但视图定义里根本没这行代码rs.getString(2)),或者 BI 工具靠列名自动映射字段,就会拿到错的数据甚至直接报错* 的解析逻辑不同,跨平台迁移时容易出现列序不一致SELECT * 必然触发列名冲突两个表都有 id 字段?name 字段?created_at 字段?SELECT * 会让数据库当场报错:Column 'id' is ambiguous。
你必须显式限定:
users.id AS user_id、orders.id AS order_id
[E-mail Address])必须加方括号,否则解析失败users.full_name AS name 和 admins.display_name AS name,避免下游硬编码依赖原始名* 拖垮SELECT * 不仅读得多,还让优化器“猜不透”你真正要什么:
WHERE status = 1 上有索引),改成 SELECT * 后,优化器发现索引里没有全部字段,被迫回表——EXPLAIN 里 Extra 列从 Using index 变成 Using where; Using index; Using temporary
TEXT 或 BLOB 时,单行物理大小暴涨,SELECT * 会把整页数据全读进 buffer pool,哪怕你只关心 id 和 title
max_allowed_packet 默认 4MB,大字段 + * 容易触发 Packets larger than max_allowed_packet are not allowed
* 失效MyBatis 的 resultMap、JPA 的 @Column、Power BI 的自动列推断,全都依赖稳定且可预测的列名与顺序。
一旦源表新增字段,SELECT * 视图返回的列序可能变化(尤其在 MySQL 中 ALTER TABLE … FIRST / AFTER 改过字段位置),导致:
ResultSet.getObject(i) 按索引取值,拿到完全无关的数据最麻烦的是:这类问题往往不报错,只静默错位——查数据时看着都对,上线跑几天才发现统计口径全歪了。