MySQL - 将部分数据从一个 table 复制到另一个

MySQL - Copying partial data from one table to another

这可能是一个愚蠢的问题,我理解为什么我会得到现在的结果,但是,我认为 mySQL 的行为不同,我无法完成文档来告诉我其他情况。

我有 2 个基本 table 如下:

CREATE TABLE test ( num INT, time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP );

CREATE TABLE test_to_copy ( num INT );

然后我在 test_to_copy table 中创建一个条目: INSERT INTO test_to_copy VALUES ( 12 );

现在我尝试复制 table test_to_copy 进行测试,如下所示: INSERT INTO test SELECT * FROM test_to_copy;

不断抛出的错误是

"Column count doesn't match value count at row 1".

我知道它在抱怨两个 table 中的列数不匹配,这意味着它不知道我们将副本分配给哪个变量,但是,不应该是这样的情况时间是自动创建的,即如果我们在复制时没有插入任何内容而不是抛出错误,则默认设置?

由于限制,我不能再在两个 table 中都有时间,我必须在 test_to_copy table 上做一个 SELECT * 因为那里超过 50 列,我想知道是否有解决此问题的简单方法?

INSERT INTO test (num)
SELECT num
FROM test_to_copy

这是一个常见问题的另一种变体:"can I query *-except-for-one-column?"

不,SQL 中没有带异常的通配符语法。 * 通配符表示所有列。如果您不想要所有列,则必须明确命名列。

如果您有多个列,因为此方法可能用于多个 table,您可以从 INFORMATION_SCHEMA.COLUMNS 获取任何给定 table 的列列表,并且使用该信息构建动态 SQL 查询。

这是一种生成列列表的方法:

SELECT 
  GROUP_CONCAT(
       CONCAT('`', column_name, '`')
  ) AS _cols
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='mydatabase' AND TABLE_NAME='mytable'
  AND COLUMN_NAME NOT IN ('time'); -- or other columns to exclude

另请参阅:

  • Select all columns except one in MySQL?
  • SQL exclude a column using SELECT * [except columnA] FROM tableA?