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   |
+-------+--------+----------+----------+


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM