Last Updated on 1월 26, 2023 by Jade(정현호)
안녕하세요.
이번 포스팅은 MySQL 8.0 에서 새로 추가된 invisible columns 기능에 대해서 확인 해보려고 합니다.
Contents
1. invisible columns 개요
invisible columns 은 MySQL 8.0.23 버전 부터 추가된 기능으로 일반적으로 쿼리에 숨겨져 있지만 명시 적으로 컬럼을 지정하여 조회하는 경우 액세스 할 수 있는 컬럼 기능 입니다.
invisible columns 을 유용하게 사용할 수 있는 상황으로는 응용 프로그램이 "SELECT * FROM 테이블" 과 같은 유형의 쿼리를 사용하여 테이블에 액세스하고 있을 경우 invisible columns 기능을 사용하여 컬럼을 추가하여 테이블 구조를 변경 하더라도 응용 프로그램에서는 오류나 별도의 변경 없이 계속 작업을 진행 할 수 있습니다.
수정 사항이 반영되어 새로 배포되는 응용 프로그램에서는 필요한 경우 명시 적으로 컬럼명을 지정하여 invisible column을 일반 컬럼 처럼 사용할 수 있습니다.
• invisible column 은 보통 열 속성에 대해서 지원합니다 : NULL, NOT NULL, AUTO_INCREMENT, 등..
•인덱스 생성은 PRIMARY KEY 및 UNIQUE 인덱스에 대해서 invisible column 포함하여 생성 할 수 있습니다
2. 테이블 생성 및 확인
2-1 CREATE TABLE
데이터베이스 와 테이블을 생성 합니다.
mysql> select version(); +-----------+ | version() | +-----------+ | 8.0.23 | +-----------+ mysql> create database test; mysql> use test; Database changed mysql> create table table1 ( id int auto_increment primary key, name varchar(20), age int invisible); mysql> describe table1; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | INVISIBLE | +-------+-------------+------+-----+---------+----------------+ mysql> show create table table1\G *************************** 1. row *************************** Table: table1 Create Table: CREATE TABLE `table1` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int DEFAULT NULL /*!80023 INVISIBLE */, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
show create 로 보게되면 8.0.23 버전에서 INVISIBLE 를 사용을 의미하는 힌트가 기재되어 있습니다 8.0.23 버전에서 위의 구문으로 테이블을 생성하게 되면 age 컬럼은 INVISIBLE 로 생성되게 됩니다.
2-2 CREATE TABLE ... LIKE
CREATE TABLE ... LIKE 로 테이블을 생성시 invisible 컬럼 속성이 포함되어 새 테이블이 생성되게 됩니다.
sql> describe table1 +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | INVISIBLE | +-------+-------------+------+-----+---------+----------------+ sql> CREATE TABLE table2 like table1; sql> describe table2 +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | INVISIBLE | +-------+-------------+------+-----+---------+----------------+
2-3 CREATE TABLE ... SELECT(CTAS)
CREATE TABLE ... SELECT(CTAS) 로 생성시 "select * from 테이블" 로 생성하게 되면 invisible 컬럼을 포함하지 않게 됩니다
sql> describe table1 +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | INVISIBLE | +-------+-------------+------+-----+---------+----------------+ sql> CREATE TABLE table3 AS select * from table1; sql> describe table3; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | NO | | 0 | | | name | varchar(20) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
CTAS 의 경우에도 명시적으로 컬럼명을 지정하였다면 invisible columns 을 포함하여 생성하게 됩니다 다만 CREATE TABLE ... LIKE 와 다르게 컬럼에 invisible 속성을 제외하고 테이블 구조와 데이터가 생성 됩니다.
sql> CREATE TABLE table4 AS select id,name,age from table1; sql> describe table4; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | int | NO | | 0 | | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
만약 CTAS 로 생성되는 테이블에도 invisible 속성이 유지되어야 한다면 테이블 생성 구문에 INVISIBLE 를 구문이 추가 되어야 합니다
sql> CREATE TABLE table5 ( id int auto_increment primary key, name varchar(20 ),age int INVISIBLE) AS select id,name,age from table1; sql> describe table5; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(20) | YES | | NULL | | | age | int | YES | | NULL | INVISIBLE | +-------+-------------+------+-----+---------+----------------+
3. DML 과 Invisible Columns
table1 테이블에는 id,name,age 3개의 컬럼이 있고 age 컬럼은 INVISIBLE 로 생성된 상태 입니다 이 상태에서 아래와 같이 컬럼을 별도로 지정하지 않고 3개의 값을 insert 를 하게 되면 에러 ERROR 1136 발생되게 됩니다.
mysql> insert into table1 values (0,'mysql', 25), (0,'kenny', 35), (0, 'lefred','44'); ERROR 1136 (21S01): Column count doesn't match value count at row 1
하지만 아래와 같이 컬럼명을 명시적으로 지정하게 되면 정상적으로 데이터 추가(insert) 가 수행 됩니다.
mysql> insert into table1(id,name,age) values (0,'mysql', 25), (0,'kenny', 35), (0, 'lefred','44'); Query OK, 3 rows affected (0.00 sec) Records: 3 Duplicates: 0 Warnings: 0
아래와 같이 * 로 조회를 할 경우 invisible columns 은 출력 되지 않습니다.
mysql> select * from table1; +----+--------+ | id | name | +----+--------+ | 1 | mysql | | 2 | kenny | | 3 | lefred | +----+--------+
insert 하였을 때와 동일한 방법으로 명시적으로 컬럼명을 SELECT 절에 기재하여 실행하면 조회가 가능 합니다.
mysql> select id, name, age from table1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | mysql | 25 | | 2 | kenny | 35 | | 3 | lefred | 44 | +----+--------+------+
UPDATE 명령문에서 invisible 컬럼을 갱신하려면 컬럼 이름을 지정하고 수행 해야 합니다.
4. Invisible Column Metadata
INFORMATION_SCHEMA 에서도 INVISIBLE 정보는 확인 할 수 있습니다.
mysql> SELECT TABLE_NAME, COLUMN_NAME, EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'table1'; +------------+-------------+----------------+ | TABLE_NAME | COLUMN_NAME | EXTRA | +------------+-------------+----------------+ | table1 | age | INVISIBLE | | table1 | id | auto_increment | | table1 | name | | +------------+-------------+----------------+
위에서 확인 한것 처럼 describe 와 show create table 로도 테이블내에 INVISIBLE 정보를 확인 할 수 있습니다.
mysql> show create table table1\G *************************** 1. row *************************** Table: table1 Create Table: CREATE TABLE `table1` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int DEFAULT NULL /*!80023 INVISIBLE */, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
5. 테이블 속성 변경(DDL)
alter table 을 통해 invisible 에서 visible 로 또는 반대로 변경이 가능 합니다
mysql> alter table table1 modify age integer visible; mysql> select * from table1; +----+--------+------+ | id | name | age | +----+--------+------+ | 1 | mysql | 25 | | 2 | kenny | 35 | | 3 | lefred | 44 | +----+--------+------+ mysql> alter table table1 modify `name` varchar(20) invisible; mysql> select * from table1; +----+------+ | id | age | +----+------+ | 1 | 25 | | 2 | 35 | | 3 | 44 | +----+------+
6. Reference
Reference Link
• mysql.com/invisible-columns.html
• lefred.be/mysql-invisible-column-part-i
연관된 다른 글







Principal DBA(MySQL, AWS Aurora, Oracle)
핀테크 서비스인 핀다에서 데이터베이스를 운영하고 있어요(at finda.co.kr)
Previous - 당근마켓, 위메프, Oracle Korea ACS / Fedora Kor UserGroup 운영중
Database 외에도 NoSQL , Linux , Python, Cloud, Http/PHP CGI 등에도 관심이 있습니다
purityboy83@gmail.com / admin@hoing.io