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