create table test_invisible(id int,name varchar(20),money float invisible)
我们假设钱这个字段涉及隐私,那么我们设置为不可见,用关键字 invisible,在表结构中我们在Extra列可以看到INVISIBLE 关键字:
2、查询一下该表select * from test_invisible
可以看到我们只能看到2个列,不可见列是目前是不显示的。
报错信息:[21S01][1136] Column count doesn't match value count at row 1
如预期,插入语句中如果我们不引用它,会报错。
如果想插入必须显示的指定列名,这么插入:insert into test_invisible(id,name,money) values (1,'zhangsan',123)
查询的时候,要注意,如果用select * from test_invisible
是无法查询money列的,如下图
必须指定列select money from test_invisible
首先我们要知道InnoDB如何存储数据?innoDB在表空间存储数据。这些记录存储并用聚簇索引排序(主键):它们被称为索引组织表。所有的二级索引也将主键作为索引中的最右边的列(即使没有公开)。这意味着当使用二级索引检索一条记录时,将使用两个索引:二级索引指向用于最终检索该记录的主键。主键会影响随机I/O和顺序I/O之间的比率以及二级索引的大小。
简单来讲对InnoDB表来说,当没有定义主键,会使用第一个唯一非空列。如果没有可用的列,InnoDB会创建一个隐藏主键(6位)。
这类主键的问题在于您无法控制它,更糟糕的是,这个值对所有没有主键的表是全局的,如果您同时对这些表执行多次写操作,可能会产生争用问题(dict_sys->mutex)。不可见列的用处:有了新的不可见列,如果业务上不允许添加新列,我们现在就可以向没有主键的表添加合适的主键。例如老系统的表不适合新增列,而且可能没有索引的表,create table test(name varchar(20),money float)
现在添加指定不可见主键:alter table test add column id int unsigned auto_increment primary key invisible first;
总结
在InnoDB中主键很重要,如果存量表没有主键,又不能显性新增列的话
从MySQL8.0.23开始,您可以用不可见列解决没有主键的表。