mysql select table_MySQL中的CREATE TABLE……SELECT语句

在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 artist.name, COUNT(work.artist_id) AS number_of_works

FROM artist LEFT JOIN work ON artist.id = work.artist_id

GROUP BY artist.id;

您也可以明确地为一个已生成的列指定类型:

CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM

bar;

根据其它表的定义(包括在原表中定义的所有的列属性和索引),使用LIKE创建一个空表:

CREATE TABLE new_tbl LIKE orig_tbl;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值