MySQL 8.0.23 新特性-不可见列

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值