#mysql #mariadb
#mysql #mariadb
Вопрос:
Я пытаюсь добавить сгенерированный столбец для существующей таблицы.
В таблице есть varchar
столбец, содержащий такие данные, как 321njkfvds_10911342
Если я добавлю сгенерированный столбец как VIRTUAL
, он будет работать хорошо!.
ALTER TABLE my_table
ADD COLUMN `PartitionKey` INT
GENERATED ALWAYS AS (IFNULL(TO_DAYS(SUBSTRING_INDEX(`Sequence`, '_', -1)), 0)) VIRTUAL
AFTER `Sequence`;
Но если я попытаюсь добавить его в качестве STORED
сгенерированного столбца, произойдет сбой.
ALTER TABLE my_table
ADD COLUMN `PartitionKey` INT
GENERATED ALWAYS AS (IFNULL(TO_DAYS(SUBSTRING_INDEX(`Sequence`, '_', -1)), 0)) STORED
AFTER `Sequence`;
Код ошибки: 1292
Неверное значение даты и времени: ‘10911342’
Я знаю 10911342
, что это недопустимая дата, но, по крайней мере, ее сгенерированный столбец 0
VIRTUAL
указан.
Но почему я не могу добавить сгенерированный столбец как STORED
пока VIRTUAL
работает? есть ли какой-нибудь способ это исправить?
@@version
---------------------
10.3.27-MariaDB-log
Комментарии:
1. Пожалуйста, добавьте версии, которые вы используете для mysql и mariadb
2. @P.Salmon добавил 🙂
3. Я получаю ту же ошибку в 10.4.5, но, на мой взгляд, виртуальная опция неверна. Насколько я знаю, нет способа «исправить» — на самом деле это выглядит как ошибка для меня.
4. Это ошибка или ожидаемое поведение? Поскольку сохраненный фактически вставляет столбец, у него другие правила, чем просто чтение столбца. Я не уверен, что для этого есть какой-то обходной путь. Было бы интересно узнать, есть ли он.
Ответ №1:
…
Когда сгенерированный столбец является ПОСТОЯННЫМ или индексированным, значение выражения должно быть согласованным независимо от флагов режима SQL в текущем сеансе. Если это не так, то таблица будет считаться поврежденной, когда значение, которое фактически должно быть возвращено вычисляемым выражением, и значение, которое ранее было сохранено и / или проиндексировано с использованием другого параметра sql_mode, расходятся.
…
См. dbfiddle .