【问题标题】:MySQL - Copying partial data from one table to anotherMySQL - 将部分数据从一个表复制到另一个表
【发布时间】:2017-10-09 15:37:56
【问题描述】:

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

我有 2 个基本表如下:

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

CREATE TABLE test_to_copy ( num INT );

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

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

不断抛出的错误是

“列计数与第 1 行的值计数不匹配”。

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

由于限制,我不能再有时间在两个表中,我必须在 test_to_copy 表上执行 SELECT *,因为有超过 50 列,我想知道有没有简单的方法解决这个问题?

【问题讨论】:

    标签: mysql copying


    【解决方案1】:

    这是一个常见问题的另一个变体:“我可以查询*-except-for-one-column吗?”

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

    如果您有多种列,因为此方法可能用于多个表,您可以从 INFORMATION_SCHEMA.COLUMNS 获取任何给定表的列列表,并使用该信息构建动态 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
    

    另见:

    【讨论】:

      【解决方案2】:
      INSERT INTO test (num)
      SELECT num
      FROM test_to_copy
      

      【讨论】:

      • 我需要“SELECT * FROM test_to_copy”,因为多个方法使用此实现,而不是为每个查询创建单独的方法。
      • 你也可以在我上面提到的查询中使用SELECT * FROM test_to_copy
      猜你喜欢
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 2018-10-31
      • 1970-01-01
      • 2015-05-17
      • 2012-08-12
      相关资源
      最近更新 更多