2017-10-09 72 views
1

这可能是一个愚蠢的问题,我明白为什么我得到的结果是我,但是,我认为mySQL的行为不同,我无法完成文档否则告诉我。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列,我想知道是否有一种简单的方法可以解决这个问题?

回答

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 

参见:

0
INSERT INTO test (num) 
SELECT num 
FROM test_to_copy 
+0

我需要 “SELECT * FROM test_to_copy”因为多个方法使用此实现而不是创建单个方法f或每个查询。 –

+0

您也可以在上面提到的查询中使用'SELECT * FROM test_to_copy'。 –

相关问题