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的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
MySql新手入门的基本操作汇总
May 13 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
May 06 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL的意向共享锁、意向排它锁和死锁
Jul 15 MySQL
MySQL常用慢查询分析工具详解
Aug 14 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
PHP文件操作详解
2016/12/30 PHP
php curl常用的5个经典例子
2017/01/20 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
linux mint下安装phpstorm2020包括JDK部分的教程详解
2020/09/17 PHP
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
js字符串转换成数字与数字转换成字符串的实现方法
2014/01/08 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
JavaScript中的boolean布尔值使用学习及相关技巧讲解
2016/05/26 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
Vue组件开发初探
2017/02/14 Javascript
jquery实现图片放大点击切换
2017/06/06 jQuery
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
整理Python最基本的操作字典的方法
2015/04/24 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
Python实现DDos攻击实例详解
2019/02/02 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
浅谈Pycharm最有必要改的几个默认设置项
2020/02/14 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
ProBikeKit德国:在线公路自行车专家
2018/06/03 全球购物
介绍一下游标
2012/01/10 面试题
什么是触发器(trigger)? 触发器有什么作用?
2013/09/18 面试题
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
导游词之太原天龙山
2020/01/02 职场文书