MySQL创建临时表-旧表建新表

1、创建临时表

  临时表是一张表,用来临时保存一些数据

特点:

  只对创建该临时表的用户可见;

  当会话结束时,MySQL自动删除临时表。

临时表的核心:建表和删表消耗资源极其少



创建临时表的基本格式:

  CREATE TEMPORARY TABLE  tbl_name(……);

①创建的临时表在当前会话,正常使用

②断开连接,再重新连接后执行查询,抛出异常:

  错误代码: 1146

  Table ‘db_name.temtbl_name’ doesn‘t exist。//该临时表在会话结束的时候被系统删除。



注意:用户可以创建一个和已有的普通表名字相同的临时表。

在这种情况下,

  该用户只能看到临时表而看不见同名的普通表;

  当临时表被删除后,才可以看到普通表。

示例:使用相同的名字创建一个普通表和临时表

mysql> create table test_table(num int);
Query OK, 0 rows affected (0.12 sec)

mysql> insert into test_table values(1);
Query OK, 1 row affected (0.04 sec)

mysql> create temporary table test_table(num int,name varchar(20));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into test_table values(2,‘临时表测试‘);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test_table;
+------+-----------------+
| num  | name            |
+------+-----------------+
|    2 | 临时表测试       |
+------+-----------------+
1 row in set (0.00 sec)

mysql> drop table test_table;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from test_table;
+------+
| num  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

Q:当创建表时,如果表已经存在了,则MySQL会返回出错消息,我们不希望看到报错的信息,该如何处理?

A:添加IF NOT EXISTS选项,则强制不显示这个出错消息;但是,语句执行失败---建表失败。

mysql> create table if not exists PLAYERS(id int(5),name varchar(20));
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+--------------------------------+
| Level | Code | Message                        |
+-------+------+--------------------------------+
| Note  | 1050 | Table ‘PLAYERS‘ already exists |
+-------+------+--------------------------------+
1 row in set (0.00 sec)

mysql> show tables;
+-------------------+
| Tables_in_TENNIS  |
+-------------------+
| COMMITTEE_MEMBERS |
| MATCHES           |
| PENALTIES         |
| PLAYERS           |
| TEAMS             |
| test_table        |
+-------------------+
6 rows in set (0.00 sec)

2、根据已有的表来创建新表

语法1:只想拷贝表结构

  CREATE TABLE new_tbl LIKE orig_tbl;

将从源表复制列名、数据类型、大小、非空约束以及索引;而表的内容以及其它约束不会复制,新表是一张空表。

mysql> desc TEAMS;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| TEAMNO   | int(11) | NO   | PRI | NULL    |       |
| PLAYERNO | int(11) | NO   |     | NULL    |       |
| DIVISION | char(6) | NO   |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> create table copy_TEAMS like TEAMS;
Query OK, 0 rows affected (0.11 sec)

mysql> select * from copy_TEAMS;
Empty set (0.00 sec)

mysql> desc copy_TEAMS;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| TEAMNO   | int(11) | NO   | PRI | NULL    |       |
| PLAYERNO | int(11) | NO   |     | NULL    |       |
| DIVISION | char(6) | NO   |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
3 rows in set (0.00 sec)

语法2:根据SELECT子查询的拷贝

  CREATE TABLE new_tbl [AS] SELECT {*|column,...} FROM orig_tbl;

新表的结构由select列表决定;同时把查询返回的结果集中的行插入到目标表中;只能把非空约束带入到新表中,也不会复制索引

mysql> create table p_m
    -> as
    -> select a.NAME,a.SEX,b.MATCHNO,b.WON,b.LOST
    -> from PLAYERS a,MATCHES b
    -> where a.PLAYERNO=b.PLAYERNO;
Query OK, 13 rows affected (0.15 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> select * from p_m;
+-----------+-----+---------+-----+------+
| NAME      | SEX | MATCHNO | WON | LOST |
+-----------+-----+---------+-----+------+
| Parmenter | M   |       1 |   3 |    1 |
| Parmenter | M   |       2 |   2 |    3 |
| Parmenter | M   |       3 |   3 |    0 |
| Baker     | M   |       4 |   3 |    2 |
| Hope      | M   |       5 |   0 |    3 |
| Everett   | M   |       6 |   1 |    3 |
| Brown     | M   |       7 |   3 |    0 |
| Newcastle | F   |       8 |   0 |    3 |
| Collins   | F   |       9 |   3 |    2 |
| Moorman   | F   |      10 |   3 |    2 |
| Bailey    | F   |      11 |   2 |    3 |
| Bailey    | F   |      12 |   1 |    3 |
| Newcastle | F   |      13 |   0 |    3 |
+-----------+-----+---------+-----+------+
13 rows in set (0.00 sec)

通过根据已有表来创建新表,添加选项temporary,创建临时副本用来做练习最合适:表内容可一样,会话结束,临时表自动删除,原始表中的内容不受任何影响。

注意:

  如果在表名后面指定的列名和原始表中的列名相同,则可以改变列的大小和非空约束;

  如果在表名后面指定的列名和原始表中的列名不同,则它作为一个新的列。

mysql> select * from TEAMS;
+--------+----------+----------+
| TEAMNO | PLAYERNO | DIVISION |
+--------+----------+----------+
|      1 |        6 | first    |
|      2 |       27 | second   |
+--------+----------+----------+

mysql> CREATE TABLE teams_copy
    -> (
    ->    teamno INTEGER NOT NULL PRIMARY KEY,
    ->    playerno INTEGER NULL,
    ->    division char(10) NOT NULL,
    ->    coach varchar(20)
    -> )
    -> as
    -> select * from TEAMS;
Query OK, 2 rows affected (0.11 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from teams_copy;
+-------+--------+----------+----------+
| coach | TEAMNO | PLAYERNO | DIVISION |
+-------+--------+----------+----------+
| NULL  |      1 |        6 | first    |
| NULL  |      2 |       27 | second   |
+-------+--------+----------+----------+
时间: 2024-12-06 18:33:02

MySQL创建临时表-旧表建新表的相关文章

[转载]mysql创建临时表,将查询结果插入已有表中

今天遇到一个很棘手的问题,想临时存起来一部分数据,然后再读取.我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些.然后还需要将查询的结果存储到临时表中.下面是创建临时表以及插入数据的例子,以供大家参考. A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10)

mysql创建临时表,将查询结果插入已有的表

A.临时表再断开于mysql的连接后系统会自动删除临时表中的数据,但是这只限于用下面语句建立的表:1)定义字段  CREATE TEMPORARY TABLE tmp_table (      name VARCHAR(10) NOT NULL,       time date  NOT NULL  )更高级点就是:create temporary  TABLE `temtable` (  `jws` varchar(100) character set utf8 collate utf8_bi

Mysql 创建一个触发器,实现两表之间同步

1.建person表 CREATE TABLE `person` ( `id` int(11) DEFAULT NULL, `name` varchar(256) DEFAULT NULL, `sex` char(16) DEFAULT NULL) 建person_exCREATE TABLE `person_ex` ( `id` int(11) DEFAULT NULL, `name` varchar(256) DEFAULT NULL, `sex` char(16) DEFAULT NULL

Mysql数据库多对多关系未建新表

原则上,多对多关系是要新建一个关系表的,当遇到没有新建表的情况下如何查询多对多的SQL呢? FIND_IN_SET(str,strlist) 官网:http://dev.mysql.com/doc/refman/5.7/en/string-functions.html Mysql数据库 此数据库为设计不合理的demo,仅用来示范多对多关系. 创建表结构 -- 新建user表 CREATE TABLE `user` ( `id` INT(11) NOT NULL COMMENT '人员id', `

oracle中利用旧表生成新表

数据库中原有表CCC,字段如图 create table CCCAAABBB as select *from CCC where 1=2 上面用1=2代表只是复制原有表的表结构 若: 就是除了表的名字不同,table结构与字段均相同

移动表到新表空间后重建索引

将某个表空间内的多个数据库表移动到另一个表空间后,由于没有处理索引,导致到新库中查询.插入等操作时,oracle报错: ORA-01502: 索引 'WWYSBI41.SYS_C0027004' 或这类索引的分区处于不可用状态 原因是仍用了之前表空间的索引,解决办法是重建这些索引. 对单个表索引, alter index <index_name> rebuild (online) 注:上面的index_name外面的<和>只是表示这是一个变量,并不是真的要加<与>. 对

sql 创建表、删除表 增加字段 删除字段操作

[转]sql 创建表.删除表 增加字段 删除字段操作 下面是Sql Server 和 Access 操作数据库结构的常用Sql,希望对你有所帮助. 新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) default \'默认值\' null ,[字段2] ntext null ,[字段3] datetime,[字段4] money null ,[字段5] int default 0,[

SqlServer2012-创建表、删除表 增加字段 删除字段操作

新建表:create table [表名]([自动编号字段] int IDENTITY (1,1) PRIMARY KEY ,[字段1] nVarChar(50) default \'默认值\' null ,[字段2] ntext null ,[字段3] datetime,[字段4] money null ,[字段5] int default 0,[字段6] Decimal (12,4) default 0,[字段7] image null ,) 删除表:Drop table [表名] 插入数据

15.表结构修改-修改表定义和表名

修改列定义和表名 修改列定义 ALTER  TABLE  S MODIFY  type TINYINT  UNSIGNED  NOT NULL;(modify是调整 稍作修改的意思,UNSIGNED表示是无符号的,是一个正数如果直接不用UNSIGNED,那int可以是正数负数和零) 演示: 修改表字段 --type(字段名称)  数据类型:tinyint(小整型) 默认是1 将type int ,默认值为2 ALETER TABLE member MODIFY  type  INT UNSIGN