MySQL 8.0 之不可见列的基本操作


Posted in MySQL onMay 20, 2021

01 创建不可见列

创建不可见列:

CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `age` int DEFAULT NULL INVISIBLE,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

   可以看到,我们的SQL里面创建了一个表t2的字段有id、name和age,其中,age字段设置了不可见属性。

   当然,我们可以使用alter table的语法来创建一个不可见列,给t2表中,添加一个score的不可见字段

mysql> alter table t2  add  score int invisible;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

create table like 的语法能不能完美兼容invisible字段呢?答案是可以的。

mysql> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL /*!80023 INVISIBLE */,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> create table t3 like t1;
Query OK, 0 rows affected (0.09 sec)

mysql> show create table t3\G
*************************** 1. row ***************************
Table: t3
Create Table: CREATE TABLE `t3` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`age` int DEFAULT NULL /*!80023 INVISIBLE */,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

而create table as的语法,默认是不保留invisible列的,如果想保留这个列,请采用下面的方法:

02 不可见列基本操作

    我们创建一个t1的表,包含id、name、age3个字段,其中,age字段是invisible的,下面来看几个基本操作:

mysql> insert into t1 values (1,'zhangsan',10);
ERROR 1136 (21S01): Column count doesn't match value count at row 1

mysql> insert into t1 (id,name,age) values (1,'zhangsan',10); 
Query OK, 1 row affected (0.01 sec)

mysql> select * from t1;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
+----+----------+
1 row in set (0.00 sec)

   首先我们往表t1中插入1条记录,它包含3个字段,发现报错,提示列的数量不对应;

    然后我们在插入的时候,补充对应的字段,则发现插入正常了。

    但是在使用select * 语法进行查询的时候,发现查询的结果中,只有id 和name两个列,对于age这个invisible的列,默认是不显示的。

     当然,我们可以显示使用select来查看这个列:

mysql> select id,name,age from t1;
+----+----------+------+
| id | name     | age  |
+----+----------+------+
|  1 | zhangsan |   10 |
+----+----------+------+
1 row in set (0.00 sec)

03 不可见列元信息

    可以通过information_schema来查看某个列是否是不可见列,或者desc + table_name 的命令也可以。如下:

HERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';
+------------+-------------+-----------+
| TABLE_NAME | COLUMN_NAME | EXTRA     |
+------------+-------------+-----------+
| t1         | i           |           |
| t1         | j           |           |
| t1         | k           | INVISIBLE |
+------------+-------------+-----------+

mysql> desc test.t1;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int         | NO   | PRI | NULL    | auto_increment |
| name  | varchar(20) | YES  |     | NULL    |                |
| age   | int         | YES  |     | NULL    | INVISIBLE      |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

04 用作主键id

   看下面这个例子,我们设置主键id为不可见列,这样我们将更多的精力放在表的数据内容相关的字段上,而不必去关心id列,将它隐藏起来:

mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> create table t4 (id int not null auto_increment primary key invisible,name varchar(20),age int );
Query OK, 0 rows affected (0.07 sec)

mysql> insert into t4 values ('zhangsan',10),('lisi',15);
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t4;
+----------+------+
| name     | age  |
+----------+------+
| zhangsan |   10 |
| lisi     |   15 |
+----------+------+
2 rows in set (0.00 sec)

   这种方法有一个很大的好处:假设业务设计的表没有主键,这种表结构DBA肯定不允许,那么DBA就可以在不修改业务逻辑的情况下,将主键设置成一个不可见列,来解决这个表的问题。

以上就是MySQL 8.0 之不可见列的基本操作的详细内容,更多关于MySQL 8.0 不可见列的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL令人大跌眼镜的隐式转换
Aug 23 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
MySQL分区路径子分区再分区
Apr 13 MySQL
MySQL 字符集 character
May 04 MySQL
MySQL中EXPLAIN语句及用法
May 20 MySQL
MySQL如何修改字段类型和字段长度
Jun 10 MySQL
关于mysql中string和number的转换问题
Jun 14 MySQL
一文解答什么是MySQL的回表
Aug 05 MySQL
Mysql Online DDL的使用详解
May 20 #MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
MySQL 覆盖索引的优点
May 19 #MySQL
MySQL 视图(View)原理解析
超详细教你怎么升级Mysql的版本
详解mysql三值逻辑与NULL
You might like
利用PHP制作简单的内容采集器的代码
2007/11/28 PHP
PHP 文件缓存的性能测试
2010/04/25 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
PHP Callable强制指定回调类型的方法
2016/08/30 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
javascript 面向对象全新理练之数据的封装
2009/12/03 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
editable.js 基于jquery的表格的编辑插件
2011/10/24 Javascript
基于javascript的COOkie的操作实现只能点一次
2014/12/26 Javascript
浅析JavaScript中浏览器的兼容问题
2016/04/19 Javascript
使用Bootstrap美化按钮实例代码(demo)
2017/02/03 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
jQuery+ajax实现用户登录验证
2020/09/13 jQuery
Java 生成随机字符的示例代码
2021/01/13 Javascript
给Python初学者的一些编程技巧
2015/04/03 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
2017/12/08 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
树莓派用python中的OpenCV输出USB摄像头画面
2019/06/22 Python
python开头的coding设置方法
2019/08/08 Python
介绍Java的内部类
2012/10/27 面试题
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
2015/02/22 面试题
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
北京振戎融通Java面试题
2015/09/03 面试题
生态学毕业生自荐信
2013/10/27 职场文书
国际商务专业职业生涯规划书范文
2014/01/17 职场文书
学校食品安全实施方案
2014/06/14 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
公司总经理岗位职责范本
2014/08/15 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
婚庆司仪开场白
2015/05/29 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Python 统计序列中元素的出现频度
2022/04/26 Python