在MySQL中,可使用CREATE TALBE. . .SELECT语句将查询结果转存到一个新表中。
创建新表
create table tabname(col1 type1 [not null] [primary key],col2
type2 [not null],..)
根据已有的表创建新表
create table tab_new like tab_old
(使用旧表创建新表)
create table tab_new as select col1,col2 . . . from tab_old
definition only
您可以在CREATE TABLE语句的末尾添加一个SELECT语句,在一个表的基础上创建表。
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
MySQL会对SELECT中的所有项创建新列。举例说明:
mysql> CREATE TABLE test (a INT NOT NULL
AUTO_INCREMENT,
-> PRIMARY KEY (a), KEY(b))
-> TYPE=MyISAM SELECT b,c FROM test2;
本语句用于创建含三个列(a, b,
c)的MyISAM表。注意,用SELECT语句创建的列附在表的右侧,而不是覆盖在表上。参考以下示例:
mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+
mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM bar;
+------+---+
| m | n
|
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)
对应于表foo中的每一行,在表bar中插入一行,含有表foo中的值以及新列中的默认值。
在由CREATE TABLE...SELECT生成的表中,只在CREATE
TABLE部分中命名的列首先出现。在两个部分中都命名的列和只在SELECT部分中命名的列随后出现。也可以通过指定CREATE
TABLE部分中的列覆盖SELECT列中的数据类型。
如果在把数据复制到表中时出现错误,则表会自动被取消,不会被创建。
CREATE
TABLE...SELECT不会自动创建任何索引。索引需要专门创建,以便使语句的灵活性更强。如果您希望为已创建的表建立索引,您应在SELECT语句前指定索引。
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
列的类型会发生部分转化。例如,AUTO_INCREAMENT属性不会被保留,VARCHAR列会变成CHAR列。
当使用CREATE...SELECT创建表时,在查询时一定要对功能调用和表达式起别名。如果不起别名,则CREATE语句会出现错误或者生成不符合需要的列名称。
CREATE TABLE artists_and_works
SELECT , COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON = work.artist_id
GROUP BY ;
您也可以明确地为一个已生成的列指定类型:
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM
bar;
根据其它表的定义(包括在原表中定义的所有的列属性和索引),使用LIKE创建一个空表:
CREATE TABLE new_tbl LIKE orig_tbl;