Spec-Zone.ru › MySQL 8.4

15.1.20.10 Скрытые столбцы

MySQL 8.4 поддерживает скрытые столбцы. Скрытый столбец обычно скрыт от запросов, но может быть доступен, если явно указан.

В качестве примера использования скрытых столбцов, предположим, что приложение использует SELECT * запросы для доступа к таблице и должно продолжать работать без изменений, даже если таблица изменена для добавления нового столбца, которого приложение не ожидает. В SELECT * запросе * возвращает все столбцы таблицы, за исключением скрытых, поэтому решением является добавление нового столбца как скрытого столбца. Столбец остаётся “скрытым” от SELECT * запросов, и приложение продолжает работать, как и прежде. Более новая версия приложения может ссылаться на скрытый столбец при необходимости, явно указав его.

Следующие разделы подробно описывают, как MySQL обрабатывает скрытые столбцы.

  • DDL-выражения и скрытые столбцы

  • DML-выражения и скрытые столбцы

  • Метаданные скрытых столбцов

  • Двоичный журнал и скрытые столбцы

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 обрабатывает скрытые столбцы так же, как и видимые столбцы: Скрытые столбцы участвуют в сравнении значений ключей. В частности, если у новой строки есть такое же значение, как у существующей строки для значения уникального ключа, эти поведения происходят независимо от того, являются ли столбцы индекса видимыми или скрытыми:

  • С модификатором IGNORE, операторы INSERT, LOAD DATA и LOAD XML игнорируют новую строку.

  • REPLACE заменяет существующую строку новой строкой. С модификатором REPLACE, LOAD DATA и LOAD XML делают то же самое.

  • INSERT ... ON DUPLICATE KEY UPDATE обновляет существующую строку.

Чтобы обновить скрытые столбцы для операторов 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/invisible-columns.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API