mysql — ошибка недопустимой даты при создании сохраненного сгенерированного столбца

#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 .