Invisible Columns
Invisible columns (sometimes also called hidden columns) are hidden in certain contexts.
Columns can be given an INVISIBLE
attribute in a CREATE TABLE or ALTER TABLE statement. These columns will then not be listed in the results of a SELECT * statement, nor do they need to be assigned a value in an INSERT statement, unless INSERT explicitly mentions them by name.
Since SELECT *
does not return the invisible columns, new tables or views created in this manner will have no trace of the invisible columns. If specifically referenced in the SELECT statement, the columns will be brought into the view/new table, but the INVISIBLE attribute will not.
Invisible columns can be declared as NOT NULL
, but then require a DEFAULT
value.
It is not possible for all columns in a table to be invisible.
Examples
CREATE TABLE t (x INT INVISIBLE); ERROR 1113 (42000): A table must have at least 1 column CREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL); ERROR 4106 (HY000): Invisible column `z` must have a default value CREATE TABLE t (x INT, y INT INVISIBLE, z INT INVISIBLE NOT NULL DEFAULT 4); INSERT INTO t VALUES (1),(2); INSERT INTO t (x,y) VALUES (3,33); SELECT * FROM t; +------+ | x | +------+ | 1 | | 2 | | 3 | +------+ SELECT x,y,z FROM t; +------+------+---+ | x | y | z | +------+------+---+ | 1 | NULL | 4 | | 2 | NULL | 4 | | 3 | 33 | 4 | +------+------+---+ DESC t; +-------+---------+------+-----+---------+-----------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-----------+ | x | int(11) | YES | | NULL | | | y | int(11) | YES | | NULL | INVISIBLE | | z | int(11) | NO | | 4 | INVISIBLE | +-------+---------+------+-----+---------+-----------+ ALTER TABLE t MODIFY x INT INVISIBLE, MODIFY y INT, MODIFY z INT NOT NULL DEFAULT 4; DESC t; +-------+---------+------+-----+---------+-----------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-----------+ | x | int(11) | YES | | NULL | INVISIBLE | | y | int(11) | YES | | NULL | | | z | int(11) | NO | | 4 | | +-------+---------+------+-----+---------+-----------+
Creating a view from a table with hidden columns:
CREATE VIEW v1 AS SELECT * FROM t; DESC v1; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | y | int(11) | YES | | NULL | | | z | int(11) | NO | | 4 | | +-------+---------+------+-----+---------+-------+ CREATE VIEW v2 AS SELECT x,y,z FROM t; DESC v2; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | x | int(11) | YES | | NULL | | | y | int(11) | YES | | NULL | | | z | int(11) | NO | | 4 | | +-------+---------+------+-----+---------+-------+
Adding a Surrogate Primary Key:
create table t1 (x bigint unsigned not null, y varchar(16), z text); insert into t1 values (123, 'qq11', 'ipsum'); insert into t1 values (123, 'qq22', 'lorem'); alter table t1 add pkid serial primary key invisible first; insert into t1 values (123, 'qq33', 'amet'); select * from t1; +-----+------+-------+ | x | y | z | +-----+------+-------+ | 123 | qq11 | ipsum | | 123 | qq22 | lorem | | 123 | qq33 | amet | +-----+------+-------+ select pkid, z from t1; +------+-------+ | pkid | z | +------+-------+ | 1 | ipsum | | 2 | lorem | | 3 | amet | +------+-------+