15.1.21.10 Невидимые столбцы
MySQL 9.2 поддерживает невидимые столбцы. Невидимый столбец обычно скрыт от запросов, но может быть доступен, если он явно указан.
В качестве иллюстрации того, когда невидимые столбцы могут быть полезны, предположим, что приложение использует SELECT * запросы для доступа к таблице, и должно продолжать работать без изменений, даже если таблица изменена добавлением нового столбца, который приложение не ожидает увидеть. В SELECT * запросе, * вычисляет все столбцы таблицы, за исключением невидимых, поэтому решением является добавление нового столбца в качестве невидимого столбца. Столбец остаётся “скрытым” от SELECT
* запросов, и приложение продолжает работать как прежде. Более новая версия приложения может обратиться к невидимому столбцу при необходимости, явно указав его.
В следующих разделах подробно описывается, как MySQL обрабатывает невидимые столбцы.
DDL-выражения и невидимые столбцы
Столбцы по умолчанию видимы. Чтобы явно указать видимость нового столбца, используйте ключевое слово VISIBLE или INVISIBLE в качестве части определения столбца для CREATE TABLE или ALTER TABLE:
CREATE TABLE t1 (
i INT,
j DATE INVISIBLE
) ENGINE = InnoDB;
ALTER TABLE t1 ADD COLUMN k INT INVISIBLE;
Чтобы изменить видимость существующего столбца, используйте ключевое слово VISIBLE или INVISIBLE с одним из ALTER TABLE пунктов изменения столбца:
ALTER TABLE t1 CHANGE COLUMN j j DATE VISIBLE;
ALTER TABLE t1 MODIFY COLUMN j DATE INVISIBLE;
ALTER TABLE t1 ALTER COLUMN j SET VISIBLE;
Таблица должна иметь как минимум один видимый столбец. Попытка сделать все столбцы невидимыми приводит к ошибке.
Невидимые столбцы поддерживают обычные атрибуты столбцов: NULL, NOT NULL, AUTO_INCREMENT и так далее.
Сгенерированные столбцы могут быть невидимыми.
В определениях индексов можно называть невидимые столбцы, включая определения индексов PRIMARY KEY и UNIQUE. Хотя таблица должна иметь хотя бы один видимый столбец, определение индекса не обязательно должно содержать видимые столбцы.
Невидимый столбец, удалённый из таблицы, удаляется обычным способом из любого определения индекса, в котором указан этот столбец.
Ограничения внешнего ключа могут быть определены на невидимых столбцах, и ограничения внешнего ключа могут ссылаться на невидимые столбцы.
CHECK ограничения могут быть определены на невидимых столбцах. При создании или изменении строк нарушение CHECK ограничения на невидимом столбце приводит к ошибке.
CREATE
TABLE ... LIKE включает невидимые столбцы, и они будут невидимыми в новой таблице.
CREATE
TABLE ... SELECT не включает невидимые столбцы, если они не указаны явно в части SELECT. Однако, даже если они явно указаны, столбец, который невидим в исходной таблице, будет виден в новой таблице:
mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> CREATE TABLE t2 AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`col1` int DEFAULT NULL,
`col2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Если невидимость должна сохраниться, укажите определение невидимого столбца в части CREATE
TABLE оператора CREATE
TABLE ... SELECT:
mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> CREATE TABLE t2 (col2 INT INVISIBLE) AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`col1` int DEFAULT NULL,
`col2` int DEFAULT NULL /*!80023 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
Виды могут ссылаться на невидимые столбцы, явно указав их в операторе SELECT, определяющем вид. Изменение видимости столбца после определения вида, который ссылается на столбец, не влияет на поведение вида.
DML-выражения и невидимые столбцы
Для SELECT операторов невидимый столбец не входит в результирующий набор, если он не указан явно в списке выбора. В списке выбора * и сокращения не включают невидимые столбцы. Естественные соединения не включают невидимые столбцы. tbl_name.*
Рассмотрим следующую последовательность операторов:
mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> INSERT INTO t1 (col1, col2) VALUES(1, 2), (3, 4);
mysql> SELECT * FROM t1;
+------+
| col1 |
+------+
| 1 |
| 3 |
+------+
mysql> SELECT col1, col2 FROM t1;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
+------+------+
Первый SELECT не ссылается на невидимый столбец col2 в списке выбора (потому что * не включает невидимые столбцы), поэтому col2 не появляется в результате оператора. Второй SELECT явно ссылается на col2, поэтому столбец появляется в результате.
Оператор TABLE
t1 производит тот же результат, что и первый SELECT оператор. Поскольку нет способа указать столбцы в TABLE операторе, TABLE никогда не отображает невидимые столбцы.
Для операторов, создающих новые строки, невидимому столбцу присваивается его неявное значение по умолчанию, если он не указан явно и ему не присвоено значение. Сведения о неявных значениях по умолчанию см. в разделе Обработка неявных значений по умолчанию.
Для INSERT (и REPLACE для строк, которые не заменяются) неявное присвоение значений по умолчанию происходит при отсутствии списка столбцов, пустом списке столбцов или непустом списке столбцов, не включающем невидимый столбец:
CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
INSERT INTO t1 VALUES(...);
INSERT INTO t1 () VALUES(...);
INSERT INTO t1 (col1) VALUES(...);
Для первых двух INSERT операторов список VALUES() должен предоставить значение для каждого видимого столбца и не должен содержать невидимых столбцов. Для третьего INSERT оператора список VALUES() должен содержать столько же значений, сколько названных столбцов; то же самое справедливо, когда вы используете VALUES
ROW() вместо VALUES().
Для LOAD DATA и LOAD XML неявное присвоение значений по умолчанию происходит при отсутствии списка столбцов или при непустом списке столбцов, не включающем невидимый столбец. Строки входных данных не должны содержать значения для невидимого столбца.
Чтобы присвоить значение, отличное от неявного значения по умолчанию для предыдущих операторов, явно укажите невидимый столбец в списке столбцов и предоставьте для него значение.
INSERT INTO ...
SELECT * и REPLACE INTO ...
SELECT * не включают невидимые столбцы, потому что * не включает невидимые столбцы. Неявное присвоение значений по умолчанию происходит, как описано ранее.
Для операторов, вставляющих или игнорирующих новые строки, или заменяющих или изменяющих существующие строки, на основе значений в PRIMARY
KEY или UNIQUE индексе, MySQL обрабатывает невидимые столбцы так же, как и видимые: Невидимые столбцы участвуют в сравнении значений ключей. В частности, если новая строка имеет такое же значение, как существующая строка для уникального значения ключа, эти действия выполняются независимо от того, являются ли столбцы индекса видимыми или невидимыми:
Чтобы обновить невидимые столбцы для UPDATE операторов, укажите их и присвойте им значения, как и для видимых столбцов.
Сведения о невидимых колонках
Информация о том, является ли колонка видимой или невидимой, доступна из колонки EXTRA таблицы Информационной схемы COLUMNS или вывода SHOW COLUMNS. Например:
mysql> SELECT TABLE_NAME, COLUMN_NAME, EXTRA
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';
+------------+-------------+-----------+
| TABLE_NAME | COLUMN_NAME | EXTRA |
+------------+-------------+-----------+
| t1 | i | |
| t1 | j | |
| t1 | k | INVISIBLE |
+------------+-------------+-----------+
Колонки по умолчанию видимы, поэтому в этом случае EXTRA не отображает информацию о видимости. Для невидимых колонок EXTRA отображает INVISIBLE.
SHOW CREATE TABLE отображает невидимые колонки в определении таблицы, с ключевым словом INVISIBLE в комментарии, зависящем от версии:
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`i` int DEFAULT NULL,
`j` int DEFAULT NULL,
`k` int DEFAULT NULL /*!80023 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
mysqldump использует SHOW CREATE
TABLE, поэтому они включают невидимые колонки в определении дублируемой таблицы. Они также включают значения невидимых колонок в дублируемых данных.
Загрузка файла дампа в более старую версию MySQL, которая не поддерживает невидимые колонки, приводит к игнорированию комментария, зависящего от версии, что создаёт любые невидимые колонки как видимые.
Двоичный журнал и невидимые колонки
MySQL обрабатывает невидимые колонки следующим образом в отношении событий в двоичном журнале:
События создания таблиц включают атрибут
INVISIBLEдля невидимых колонок.Невидимые колонки обрабатываются как видимые в событиях строк. Они включаются при необходимости в соответствии с настройкой системной переменной
binlog_row_image.При применении событий строк, невидимые колонки обрабатываются как видимые в событиях строк.
Невидимые колонки обрабатываются как видимые при вычислении наборов изменений. В частности, наборы изменений включают индексы, определённые на невидимых колонках.
Команда mysqlbinlog включает видимость в метаданных колонки.
© 2025 Oracle
Licensed under the GPLv2 License.