「这是我参与2022首次更文挑战的第 7 天,活动详情查看:2022首次更文挑战」
支持版本
mysql8.0.23 及以上
定义
在常规的查询操作中,如以 select * 的方式默认会查询出全部的列数据。如果我们不希望某些列的结果出现在 select * 的查询结果中,我们可以通过将那些列指定为不可见列的方式来实现
场景
假定这么一个场景:有一个多模块的项目,每个模块由不同的人负责。模块A 在某个时候,发现需要追加数个字段来满足自己的业务需求。这几个字段,其余模块以后可能需要使用,但那些模块并不希望现在这个节点对他们造成影响!
现在一个比较合适的方案就是,将新增的字段先定义为 不可见 类型,待后续合适的情况下再调整类型为可见列
DDL 与不可见列
默认情况下,定义的列都是可见的。如要修改列的可见性,请使用关键字 VISIBEL 或 INVISIBEL
建表时指定列 c2 不可见:
CREATE table(
c1 INT,
c2 INT INVISIBEL
)
通过 ALTER 修改已有列的可见性,共有如下示的 3 种方法:
-- ①
ALTER TABLE t1 CHANGE COLUMN c1 c1 DATE INVISIBEL;
-- ②
ALTER TABLE t1 MODIFY COLUMN c2 DATE VISIBLE;
-- ③
ALTER TABLE t1 ALTER COLUMN c3 INT INVISIBLE;
注意项:
- 一个表必须有至少 1 个可见列
- 不可见列支持常用的列属性:
NULL、NOT NULL、AUTO_INCREMENT等 - 可以为不可见的列创建索引,包括
PRIMARY KEY和UNIQUE索引的定义。尽管表必须至少有一个可见列,但索引定义不需要任何可见列 - 外键约束可以定义在不可见列上,外键约束可以引用不可见列
CREATE TABLE ... LIKE方式创建的表,同样会包括不可见的列,且那些列在新表同样是不可见的CREATE TABLE ... SELECTE方式创建的表,不包括不可见列,除非在select部分明确引用。但不可见列到新表后,就会变为可见列
mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> CREATE TABLE t2 AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE t2 (
col1 int DEFAULT NULL,
col2 int DEFAULT NULL
)
如果需要继续保留不可见性,需要在 create table 部分定义不可见列:
CREATE TABLE t2 (col2 INT INVISIBLE) AS SELECT col1, col2 FROM t1;
DML 与不可见列
对于 SELECT 语句,不可见的列不是结果集的一部分,除非在选择列表中明确引用。在选择列表中,* 和 tbl_name.* 简写 不包括不可见的列。
mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> INSERT INTO t1 (col1, col2) VALUES(1, 2), (3, 4);
mysql> INSERT INTO t1 VALUES(5);
mysql> SELECT * FROM t1;
+------+
| col1 |
+------+
| 1 |
| 3 |
| 5 |
+------+
mysql> SELECT col1, col2 FROM t1;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
| 5 | NULL |
+------+------+
第二条 select 显示指定需要查询不可见的 col2,结果集就出现了 col2 对应的数据
对比第 1 、第 2 条 insert,如果在插入的时候,不显示指定插入的字段,则会忽略不可见列,且不可见列会自动使用默认值