有一些表:
CREATE TABLE `asource` (
`id` int(10) unsigned NOT NULL DEFAULT '0'
);
CREATE TABLE `adestination` (
`id` int(10) unsigned NOT NULL DEFAULT '0',
`generated` tinyint(1) GENERATED ALWAYS AS (id = 2) STORED NOT NULL
);
我将一行从复制asource
到adestination
:
INSERT INTO adestination
SELECT asource.*
FROM asource;
上面会产生一个错误:
Error Code: 1136. Column count doesn't match value count at row 1
好的,要求我提及生成的查询很奇怪。但是好的,我将该列添加到查询中:
INSERT INTO adestination
SELECT asource.*, NULL AS `generated`
FROM asource;
这在 5.7.10 中运行良好。但是,它会在 5.7.11 中生成错误(由于修复:
Error Code: 3105. The value specified for generated column 'generated' in table 'adestination' is not allowed.
好的,下次试试:
INSERT INTO adestination
SELECT asource.*, 1 AS `generated`
FROM asource;
但仍然是同样的错误。我尝试了 0、TRUE、FALSE,但错误仍然存在。
声明为唯一允许的值(规范或文档)的默认值。但是,以下会产生语法错误(此处不支持 DEFAULT):
INSERT INTO adestination
SELECT asource.*, DEFAULT AS `generated`
FROM asource;
那么,如果目标表添加了一些列,其中一些列是生成的,我如何使用 INSERT INTO ... SELECT 将行从一个表复制到另一个表?
调用此查询的代码是通用的,并且不知道特定表具有哪些列。它只知道目标表有哪些额外的列。源表是活动表,目标表是源表的历史版本。它有一些额外的列,例如用户 ID 进行了更改,更改的类型(插入、更新、删除)等。