首页 > 数据库 >MySQL 8.0.23 新特性-不可见列

MySQL 8.0.23 新特性-不可见列

时间:2023-09-11 12:34:27浏览次数:52  
标签:8.0 users 23 可见 internal MySQL NULL id row

在MySQL 8.0.23之前,默认情况下,表中所有用户定义的列都是可见的。然而,从MySQL 8.0.23开始,引入了一个名为Invisible Columns的新功能,允许用户在表中隐藏特定的列。使用此功能,这些不可见的列不会出现在“SELECT*”查询中,从而提供了一种在常规查询结果中隐藏它们的方法。

 

若要查看不可见列的值,需要在查询中显式引用这些列。这意味着您需要在SELECT语句中提及特定的列名,以便在结果集中包含不可见的列。此功能提供了更大的灵活性和对列可见性的控制,允许用户根据其特定需求选择性地隐藏和显示列。

 

不可见列的一些用例,

 

1):不可见列可用于从常规查询中隐藏敏感信息,并仅在显式引用时显示这些信息。例如,表格可能包含客户的个人信息,如电子邮件地址或电话号码。通过使此类列不可见,用户可以防止敏感数据在应用程序中意外暴露。

 

2):不可见列可以帮助保持与现有应用程序的向后兼容性。如果用户希望在不影响现有应用程序的情况下将新列引入数据库,则用户可以使该列不可见,并在新应用程序中显式引用该列。通过这种方式,现有的应用程序可以在不进行任何修改的情况下继续运行。

 

3):即使在删除列时,不可见列也很有用。不要立即删除该列,只需将该列标记为不可见即可。当应用程序似乎在没有删除列的情况下正常工作时,请删除不可见列。通过这种方式,用户可以避免由于列下降而导致的数据丢失和性能等其他影响。

 

MySQL 8.0.30中引入的Generated Invisible Primary Key功能使用Invisible列为没有主键的表生成主键。

 

如何创建不可见列?

要创建具有不可见列的表,请在create table语句中使用新的列属性“invisible”。下面是一个示例来说明使用不可见列创建表:
-- Creating table with Invisible Columns

CREATE TABLE users(id INT NOT NULL,

                  name VARCHAR(50) NOT NULL,

                  internal_id INT INVISIBLE,

                  PRIMARY KEY (id));

Query OK, 0 rows affected (0.05 sec)

请注意,一个表必须至少有一个可见列。不可见列支持列的所有属性和所有约束。

 

如何在不可见列中插入值?

要向不可见列插入值,应在insert语句中显式提及列名。

-- Inserting a value for an invisible column without explicitly mentioning

-- it in a column list.

INSERT INTO users VALUES(1, "manu", 10);

ERROR 1136 (21S01): Column count doesn't match value count at row 1

 

-- Values can be inserted for all visible columns.

INSERT INTO users VALUES(1, "manu");

Query OK, 1 row affected (0.01 sec)

INSERT INTO users VALUES(2, "shatarupa");

Query OK, 1 row affected (0.01 sec)

 

-- Verify SELECT * output.

SELECT * FROM users\G

*************************** 1. row ***************************

id: 1

name: manu

*************************** 2. row ***************************

id: 2

name: shatarupa

 

-- Verify invisible column value by explicitly referring it in SELECT

SELECT *, internal_id FROM users\G

*************************** 1. row ***************************

id: 1

name: manu

internal_id: NULL

*************************** 2. row ***************************

id: 2

name: shatarupa

internal_id: NULL

 

-- Explicitly mention invisible column name in column list to insert value

INSERT INTO users(id, name, internal_id) VALUES(3, "manushya",  9);

Query OK, 1 row affected (0.01 sec)

 

-- Verify invisible column value by explicitly referring it in SELECT

SELECT *, internal_id FROM users\G

*************************** 1. row ***************************

id: 1

name: manu

internal_id: NULL

*************************** 2. row ***************************

id: 2

name: shatarupa

internal_id: NULL

*************************** 3. row ***************************

id: 3

name: manushya

internal_id: 9

在提供的SQL代码片段中,演示了具有可见列和不可见列的表的几种插入场景。

 

第1行:试图在不在列列表中指定值的情况下将值插入不可见列,会导致失败。由于列列表中不包括不可见列“internal_id”,INSERT语句失败。

 

第6行:这一行说明了在所有可见列中插入值。提供了所有可见列(id、name)的值。对于不可见列,将插入默认值(在本例中为NULL)。

 

第32行:在本例中,将一个值插入到名为“internal_id”的不可见列中。列名在列列表中明确指定,并相应地插入值。

这些示例展示了将数据插入包含可见列和不可见列的表的不同场景,突出显示了不可见列相对于插入操作的行为。

 

如何更改列的可见性属性?

 

默认情况下,列是可见的。若要更改列的可见性属性,请在alter TABLE列修改操作中使用VISIBLE或INVISIBLE子句。

-- Make column internal_id VISIBLE using CHANGE COLUMN operation

ALTER TABLE users CHANGE COLUMN internal_id internal_id INT VISIBLE;

Query OK, 0 rows affected (0.05 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

-- Verify table definition

SHOW CREATE TABLE users\G

CREATE TABLE `users` (

`id` int NOT NULL,

`name` varchar(50) NOT NULL,

`internal_id` int DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (0.00 sec)

 

-- Make column internal_id INVISIBLE using MODIFY COLUMN operation

ALTER TABLE users MODIFY COLUMN internal_id INT INVISIBLE;

Query OK, 0 rows affected (0.08 sec)

Records: 0 Duplicates: 0 Warnings: 0

 

-- Verify table definition

SHOW CREATE TABLE users\G

CREATE TABLE `users` (

`id` int NOT NULL,

`name` varchar(50) NOT NULL,

`internal_id` 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)

 

-- Make column internal_id VISIBLE using ALTER COLUMN operation

ALTER TABLE users ALTER COLUMN internal_id SET VISIBLE;

Query OK, 0 rows affected (0.05 sec)

Records: 0 Duplicates: 0 Warnings: 0

 

 -- Verify table definition

SHOW CREATE TABLE users\G

CREATE TABLE `users` (

`id` int NOT NULL,

`name` varchar(50) NOT NULL,

`internal_id` int DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

1 row in set (0.01 sec)

 

-- Make column internal_id INVISIBLE using ALTER COLUMN operation

ALTER TABLE users ALTER COLUMN internal_id SET INVISIBLE;

Query OK, 0 rows affected (0.05 sec)

Records: 0 Duplicates: 0 Warnings: 0

 

-- Verify table definition

SHOW CREATE TABLE users\G

CREATE TABLE `users` (

`id` int NOT NULL,

`name` varchar(50) NOT NULL,

`internal_id` 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)

 

提供的SQL代码片段演示了对表中列可见性的各种更改。

第1行:ALTER语句与CHANGE COLUMN子句一起用于将不可见列更改为可见列。

 

第16行:从上一次修改继续,将同一列修改回不可见列。此转换是使用ALTER语句中的MODIFY COLUMN子句实现的。

 

第31行和第46行:这些行展示了使用ALTER语句中的ALTER column子句对列的可见性属性的更改。这允许更改可见性,而无需更改列的数据类型或其他属性。

 

这些示例展示了ALTER语句在修改列可见性属性方面的灵活性,包括在不可见和可见状态之间更改列,以及在不影响其他列属性的情况下调整可见性。

 

在哪里可以找到不可见列元数据?

SHOW CREATE TABLE、SHOW COLUMNS和Information_SCHEMA.COLUMNS表中提供了有关不可见列的信息。

SHOW CREATE TABLE users\G

*************************** 1. row ***************************

       Table: users

Create Table: CREATE TABLE `users` (

  `id` int NOT NULL,

  `name` varchar(50) NOT NULL,

  `internal_id` 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)

 

SHOW COLUMNS和INFORMATION_SCHEMA.COLUMNS结果集的EXTRA列显示可见性属性。

SHOW COLUMNS FROM users\G

*************************** 1. row ***************************

Field: id

Type: int

Null: NO

Key: PRI

Default: NULL

Extra:

*************************** 2. row ***************************

Field: name

Type: varchar(50)

Null: NO

Key:

Default: NULL

Extra:

*************************** 3. row ***************************

Field: internal_id

Type: int

Null: YES

Key:

Default: NULL

Extra: INVISIBLE

3 rows in set (0.02 sec)

SELECT table_name, column_name, extra FROM INFORMATION_SCHEMA.COLUMNS

       WHERE table_schema = 'test' AND table_name = 'users'\G

*************************** 1. row ***************************

TABLE_NAME: users

COLUMN_NAME: id

EXTRA:

*************************** 2. row ***************************

TABLE_NAME: users

COLUMN_NAME: name

EXTRA:

*************************** 3. row ***************************

TABLE_NAME: users

COLUMN_NAME: internal_id

EXTRA: INVISIBLE

 

参考文献:

https://dev.mysql.com/doc/refman/8.0/en/invisible-columns.html

https://dev.mysql.com/doc/refman/8.0/en/create-table-gipks.html

请查看此新功能,并告诉我们您的反馈。

感谢您使用MySQL!

 

以上文章翻译Oracle官方博客,地址:https://blogs.oracle.com/mysql/post/mysql-invisible-columns

MySQL 8.0.23 新特性-不可见列_可见性

标签:8.0,users,23,可见,internal,MySQL,NULL,id,row
From: https://blog.51cto.com/u_16068254/7434744

相关文章

  • 2023年9月CSPM-3国标项目管理中级认证报名,哪有?
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。  【证书含金量】 ·竞聘优先......
  • 2023年下半年杭州/深圳软考(中/高级)认证报名,去哪?
    软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成项目管理工程师,属于软考三个级别中的“中级”。信息系统项目管理师,属于软考三个级别中的“高级......
  • 2023年9月深圳CPDA数据分析师认证到弘博创新
    CPDA数据分析师认证是大数据方面的认证,助力数据分析人员打下扎实的数据分析基础知识功底,为入门数据分析保驾护航。帮助数据分析人员掌握系统化的数据分析思维和方法论,提升工作效率和决策能力,遇到问题能够举一反三,为大部分决策难题提供解决方案。帮助数据分析人员掌握几种通用的数据......
  • docker安装mysql
    Docker环境下安装mysql总的来说,不推荐把mysql安装到docker下。首先是数据安全性问题:将mysql安装到docker容器,除了需要处理mysql的问题,还要考虑docker环境自身的问题,多了个docker,相当于平白无故多了一些风险项。其次是项目实施问题:首先,mysql大部分人会,但是不......
  • ZABBIX6.0监控MySQL
    官方文档:https://www.zabbix.com/cn/integrations/mysql部署过程:1.在MySQL数据库中创建监控账号并授权CREATEUSER'zabbix'@'%'IDENTIFIEDBY'Likun@123';GRANTUSAGE,REPLICATIONCLIENT,PROCESS,SHOWDATABASES,SHOWVIEWON*.*TO'zabbix'@�......
  • 【2023-09-08】梳理怨气
    20:00路沾蔬草白,天气转青高。叶下和秋吹,惊看两鬓毛。养羞因野鸟,为客讶蓬高。火急收田种,晨昏莫辞劳。                                                 ——唐·元稹《白......
  • 【2023-09-09】连岳摘抄
    23:59当天空中出现乌云的时候,我们就指出:这不过是暂时的现象,黑暗即将过去,曙光即在前头。                                                 ——XXX你的直觉是对的,你现......
  • ClickHouse使用之二 ——整合mysql,实现数据库创建查询导出
    1.mysql创建一个用于clickhouse的账号mysql_clickhouse并且授权CREATEUSER'mysql_clickhouse'@'%'IDENTIFIEDBY'Password123!';GRANTALLPRIVILEGESON*.*TO‘mysql_clickhouse’@‘%';2. 使用mysql引擎创建一个clickhouse的外部表存在一个mysql的数据库:host:......
  • Mysql数据库系列之:深入理解tinyint(n)
    Mysql数据库系列之:深入理解tinyintn一、深入理解tinyint(n)二、创建包含tinyint类型字段的表三、扩展一、深入理解tinyint(n)对于MySQL中的tinyint列,"(n)"没有任何实际意义。在MySQL中,tinyint的宽度始终为1字节,所以在定义表时指定tinyint(n)与tinyint相同。在MySQL中,tinyint字段......
  • 2023-09-11
    1.每天早上工作前看看知乎热点新闻,整理了下博客日记。2.跟售后大哥学处理事情的方式。跟硬件阳光小哥学硬件焊接基础。跟对接的驱动或嵌入式软件大佬学应用。3.剑来里面儒家的三四之争是怎么回事?https://zhuanlan.zhihu.com/p/402736332 ......