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