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;
该表已生成列。我用数据备份了数据库结构,当我恢复相同的 .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 服务器上的虚拟生成列。
这个错误也被报告了这里。
我所做的解决方法是替换转储中的虚拟列:
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 ...;"
我也发布了这个答案here。
我在使用 adminer 从 mariadb 转储它时遇到了同样的问题(https://www.adminer.org/)
就我而言,我使用 phpmyadmin 进行转储解决了这个问题。这对我有用。
我不知道原因,但管理员转储生成的值列。它不应该,因为应该在插入行时生成该值。
我没有尝试从命令行使用 mysqldump 时会发生什么...
我们设法将主要的
mysqldump
命令分成步骤来做到这一点:
删除所有表(如果您尚未在原始
--add-drop-database
命令中使用 mysqldump
参数)
将参数
--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
希望对你有帮助,祝你有美好的一天!
我不太喜欢 sed 解决方案,所以我是这样做的:
git clone -b 8.0 https://github.com/mysql/mysql-server ~/tmp/mysql-server
cd ~/tmp/mysql-server
mkdir bld && cd bld
cmake -DCMAKE_INSTALL_PREFIX=~/mysql-vanilla -DDOWNLOAD_BOOST=1 -DWITH_BOOST=~/tmp/boost ../
make -j 8
make install
~/vanilla-mysql/bin/mysqldump \
-S /var/run/mysqld/mysqld.sock \
-uuser -ppassword --triggers --events --routines \
database_name > dump.sql
转储应恢复到 Aurora / RDS 等。