Редактировать 2019-02-12 T 17:26 Z:
НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД, ЭТО ГЛУПО..
Стремясь к полному безумию, я решил попробовать это, в основном, чтобы удовлетворить свое любопытство:
exec(
'mysql -uuser -ppassword -e "USE database; CALL sys_vers(\'table_a\')"'
);
Угадай, что ...
ERROR 1067 (42000) at line 1: Invalid default value for 'valid_from'
Однако,сбрасывание самого запроса ALTER
в вызов exec
работает.Даже после всего этого, ВСТАВКА в теперь версионную таблицу выдает больше ошибок.
Invalid datetime format: 1978
Incorrect default value
'0000-00-00 00:00:00.000000' column 'valid_from'
Редактировать 2019-02-12 T 16:46 Z:
Я сузил проблему до PDO, вызвав запросы, используя
DB::getFacadeRoot()->getPDO()->exec(...)
После настройки хранимой процедуры на сервере, который выполняет оператор ALTER
, я быпросто запустите
CALL sys_vers('table_a')
из миграции.
Это также не с тем же сообщением об ошибке
SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'valid_from'
Edit 2019-02-12 T 16:04 Z:
С тех пор я пытался выполнять запросы также через DB::unprepared
.Никаких кубиков.
Я пытаюсь добавить системное управление версиями в некоторые таблицы с помощью миграций.С этой целью я выполняю эти запросы в необработанном виде:
DB::statement('SET @system_versioning_alter_history="keep";');
DB::statement(
<<<SQL
ALTER TABLE c_$tableName
ADD COLUMN valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
ADD COLUMN valid_till TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
ADD PERIOD FOR SYSTEM_TIME(valid_from, valid_till),
ADD SYSTEM VERSIONING;
SQL
);
DB::statement('SET @system_versioning_alter_history="error";');
Однако, запуск миграции через artisan
просто выдает эту ошибку:
SQLSTATE[42000]: Syntax error or access violation:
1067 Invalid default value for 'valid_from'
(SQL: ALTER TABLE c_test_versions
ADD COLUMN valid_from TIMESTAMP(6) GENERATED ALWAYS AS ROW START,
ADD COLUMN valid_till TIMESTAMP(6) GENERATED ALWAYS AS ROW END,
ADD PERIOD FOR SYSTEM_TIME(valid_from, valid_till),
ADD SYSTEM VERSIONING;)
Я ожидаюзапрос на работу, поскольку он выполняется при копировании из сообщения об ошибке и запуске в клиенте командной строки mysql
.