MySQL:使用查询结果创建新表

47
在MySQL中,我想创建一个新表,其中包含此查询中的所有信息:
select * into consultaa2 from SELECT
 CONCAT(    'UPDATE customers SET
 customers_default_address_id= ',    
 (SELECT a.address_book_id FROM
 address_book a where
 c.customers_id=a.customers_id order by
 address_book_id desc limit 1),    '
 WHERE customers_id = ', customers_id,
 ';') AS sql_statement FROM customers c
 where c.customers_id > 3894;

查询语句太长,浏览器无法显示连接操作,我需要这个来进行更新。


2
Daniel Hilgarth的回答是“正确”的答案。 - Andrew Steitz
3个回答

160

你可以这样做:

CREATE TABLE tablename SELECT * FROM othertable;

tablename 是你想要创建的新表的名称,SELECT * FROM othertable 是返回应该从中创建表的数据的查询。


1
可以像这样做,但只创建一个临时表吗? - kevando
2
@kevando 是的,它是这样的:CREATE TEMPORARY TABLE tablename AS (SELECT * FROM othertable); - pymkin
而且,是否可以像这样做,但添加一个原始查询中没有的额外字段?例如,我想为表添加一个主键,如id INT NOT NULL AUTO_INCREMENT PRIMARY KEY。这该怎么做? - Metafaniel
你可以创建一个类似于临时表的视图。它会随着其他表的更新而更新。CREATE VIEW tablename as SELECT * FROM othertable; - Cameron Monks

33

*请注意,此方法不会创建一个表(与OP标题所述不同)。如果要创建表,请参见此答案


使用查询结果向表中插入信息的格式如下:

INSERT INTO <TABLE-1> 
SELECT * FROM <TABLE-2>
在你的情况下,应该是
insert into consultaa2 
SELECT CONCAT( 'UPDATE customers SET customers_default_address_id= ',
(SELECT a.address_book_id FROM address_book a where c.customers_id=a.customers_id order by address_book_id desc limit 1), ' WHERE customers_id = ', customers_id, ';') AS sql_statement FROM customers c where c.customers_id > 3894;

请确保您插入的表格列和从选择查询返回的列匹配。


你知道我尝试了同样的事情,但不起作用,我意识到因为它是一个查询,MySQL不知道要创建什么类型的字段,这真的很疯狂,但通过手动创建表和字段进行修复 :) - Saikios
4
@daniel-hilgarth的答案实际上是对Saikio问题的正确回答,因为它将基于所选的表结构创建新表。Saikio的查询语法看起来很像用于执行此操作的TSQL语法。 - Murilo Garcia

14

MySQL创建新表

来自MySQL命令行的示例。

mysql> create table foo(id int, vorta text);
Query OK, 0 rows affected (0.02 sec)

插入行

mysql> insert into foo values(1, 'for the hoarde');
Query OK, 1 row affected (0.00 sec)

看看里面有什么

mysql> select * from foo;
+------+----------------+
| id   | vorta          |
+------+----------------+
|    1 | for the horde  |
+------+----------------+
1 row in set (0.00 sec)

使用查询结果创建新表格

mysql> create table foo2 select * from foo;
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0

检查数据是否已移动

mysql> select * from foo2;
+------+----------------+
| id   | vorta          |
+------+----------------+
|    1 | for the horde  |
+------+----------------+
1 row in set (0.00 sec)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接