MySql8.0.23 新特性:不可见列

270 阅读3分钟

「这是我参与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 KEYUNIQUE 索引的定义。尽管表必须至少有一个可见列,但索引定义不需要任何可见列
  • 外键约束可以定义在不可见列上,外键约束可以引用不可见列
  • 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,如果在插入的时候,不显示指定插入的字段,则会忽略不可见列,且不可见列会自动使用默认值