MySQL 8.0.23 新特性不可见列

2023年 9月 12日 28.2k 0

*江西数库信息技术有限公司的原创内容未经授权不得随意使用,转载请联系小编并注明来源。

在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 usersG

*************************** 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 usersG

*************************** 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 usersG

*************************** 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 usersG

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 usersG

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 usersG

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 usersG

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 usersG

*************************** 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 usersG

*************************** 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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论