Я пытаюсь использовать функцию System Versioned Tables в MariaDB. 10.3 в Ларавеле. Однако я получаю следующее исключение всякий раз, когда пытаюсь запустить ремесленную миграцию, которая изменяет таблицу.
C:\htdocs\Computers>php artisan migrate:fresh
Dropped all tables successfully.
Migration table created successfully.
PDOException : SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'row_start'
at C:\htdocs\Computers\database\migrations\2018_07_14_191112_add_system_version_to_computers.php:16
12| * @return void
13| */
14| public function up()
15| {
> 16| DB::connection()->getPdo()->exec("ALTER TABLE `COMPUTERS` ADD SYSTEM VERSIONING;");
17| }
18|
19| /**
20| * Reverse the migrations.
Exception trace:
1 PDO::exec("ALTER TABLE `COMPUTERS` ADD SYSTEM VERSIONING;")
C:\htdocs\Computers\database\migrations\2018_07_14_191112_add_system_version_to_computers.php:16
2 AddSystemVersionToComputers::up()
C:\htdocs\Computers\vendor\laravel\framework\src\Illuminate\Database\Migrations\Migrator.php:359
Please use the argument -v to see more details.
Я пробовал это на пустой таблице, а также на той, в которой уже есть данные
Я пытался подавить исключения PDO следующим образом, но он действует так, как будто он работает, но система управления версиями не добавляется, когда я проверяю таблицу
DB::connection()->getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
Я могу добавить системную версию в таблицу, если выполню тот же SQL в HeidiSQL.
Я искал в документации и коде Laravel любые методы, которые позволили бы мне добавить эту опцию таблицы при создании, но ничего не нашел.
Я мог бы вручную обойти это, но я действительно хочу включить это в файлы миграции Laravel, чтобы оно было включено в репозиторий Git.
Результат выполнения команды
SHOW CREATE TABLE `computers`;
...
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| computers | CREATE TABLE `computers` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `computers_name_unique` (`Name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
+-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
Ниже приведены результаты выполнения того же оператора SQL из командной строки MariaDB. Обратите внимание на добавление WITH SYSTEM VERSIONING в определение таблицы.
MariaDB [computers]> ALTER TABLE COMPUTERS ADD SYSTEM VERSIONING;
Query OK, 0 rows affected (0.025 sec)
Records: 0 Duplicates: 0 Warnings: 0
MariaDB [computers]> SHOW CREATE TABLE `computers`;
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| computers | CREATE TABLE `computers` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `computers_name_unique` (`Name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci WITH SYSTEM VERSIONING |
+-----------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.002 sec)
Запустил ту же команду alter table в Artisan Tinker и получил ту же ошибку:
>>> DB::connection()->getPdo()->exec("ALTER TABLE `COMPUTERS` ADD SYSTEM VERSIONING;");
PDOException with message 'SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'row_start''
Все еще получаю ту же ошибку, если я пытаюсь предоставить все для пользователя computers-lcl
.
DROP USER IF EXISTS `computers-lcl`@`localhost`;
FLUSH PRIVILEGES;
GRANT ALL ON *.* TO `computers-lcl`@`localhost` IDENTIFIED BY 'qej8lOjoc81Ekub1d26uzerOv332Qa' WITH GRANT OPTION;
Заранее благодарим за любые рекомендации.
COMPUTERS
ADD SYSTEM VERSIONING; оператор выдает исключение, и когда я пытаюсь посмотреть, что показывает таблица, ничего не изменилось. Я отредактирую исходный вопрос, включив в него определение таблицы. - person Eric Medlin   schedule 17.07.2018