这可能是一个愚蠢的问题,我理解为什么我得到了我的结果,但是,我认为mySQL采取了不同的行为,我无法完成文档告诉我。
我有两个基本表格如下:
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列,我想知道有一个简单的方法吗?< / p>
答案 0 :(得分:1)
这是常见问题的另一种变体:&#34;我可以查询*-except-for-one-column
吗?&#34;
不,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
另见:
答案 1 :(得分:0)
INSERT INTO test (num)
SELECT num
FROM test_to_copy