CREATE TABLE `revenue_daily` ( `wallet` varbinary(100) NOT NULL DEFAULT '0',
`tc_access` varbinary(100) NOT NULL DEFAULT '0',
`tc_short` varbinary(100) NOT NULL DEFAULT '0',
`total_toll_collection` varbinary(100) GENERATED ALWAYS AS (`wallet` + `tc_access`) VIRTUAL NOT NULL,
`cash_collection` varbinary(100) GENERATED ALWAYS AS (`total_toll_collection` - `tc_short`) VIRTUAL NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=ascii;
该表已生成列。I使用数据备份了数据库结构,当我还原相同的.sql文件时,则发生错误。错误是: -
ERROR 3105 (HY000) at line 262: The value specified for generated column 'total_toll_collection' in table 'revenue_daily' is not allowed.
我正在使用mySQL版本: -
sunilp@sunilp ~> mysql --version
mysql: [Warning] World-writable config file '/etc/mysql/mysql.conf.d mysqld.cnf' is ignored.
mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64) using EditLine wrapper
这是一个问题,将Mariadb与虚拟生成的列一起使用MySqlDump。Mariadb的MySqlDump显然会转储生成的值,但是MySQL仅接受DEFAULT
作为虚拟生成列的值。
似乎您需要使用MySQL的MySqlDump正确转储并还原虚拟生成的列在MySQL Server上。
此处也报告了该错误。
我作为解决方法要做的是替换转储中的虚拟列:
sed -i 's/GENERATED ALWAYS AS .* VIRTUAL/NOT NULL/' mydump.sql
然后还原转储,然后再次删除/添加生成的列:
mysql -e "ALTER TABLE foo DROP COLUMN bar;
ALTER TABLE foo ADD COLUMN bar VARCHAR(255) AS ...;"
我也在这里发布了此答案。
我使用adminer(https://www.adminer.org/)从Mariadb倾倒它也有相同的问题
在我的情况下,我解决了使用phpmyadmin进行转储的问题。它对我有用。
我不知道原因,但是管理员转储生成的值列。它不应该是因为插入行时应该生成该值。
我没有尝试从命令行使用mySqlDump时会发生什么...
我们通过将主要mysqldump
命令分为步骤来完成此操作:
-
丢弃所有表(如果您尚未在原始
mysqldump
命令中使用--add-drop-database
参数) -
将参数
--ignore-table=your_schema.your_table
添加到您的原始mysqldump
命令 -
在此运行后,使用新的
mysqldump
命令仅创建表结构:mysqldump --no-data ... your_schema your_table
-
使用
mysql
命令在your_table上运行正确的ALTER
(您想更改基本类型的类型),例如:mysql ... -D your_schema -e "ALTER TABLE your_table MODIFY COLUMN your_column1 boolean default null, MODIFY COLUMN your_column2 boolean default null;"
-
最后,使用
mysqldump
命令仅填充表(不创建):mysqldump --no-create-info ... -e your_schema your_table
希望它会有所帮助,过得愉快!