在本教學中,您將學習如何使用CREATE TABLE
和SELECT
語句在同一資料庫或從一個資料庫複製表。
將資料從現有表複製到新的資料,在某些情況下非常有用,例如備份資料和複製生產資料進行測試。
要將資料從表複製到新表,請使用CREATE TABLE和SELECT語句,如下所示:
CREATE TABLE new_table
SELECT col, col2, col3
FROM
existing_table;
首先,MySQL使用CREATE TABLE語句中指定的名稱建立一個新錶。新表的結構由SELECT
語句的結果集定義。 然後,MySQL將來自SELECT
語句的資料填充到新表中。
要將部分資料從現有表複製到新表中,請在SELECT
語句中使用WHERE子句,如下所示:
CREATE TABLE new_table
SELECT col1, col2, col3
FROM
existing_table
WHERE
conditions;
在建立之前,檢查您要建立的表是否已存在是非常重要的。 為此,您可以在CREATE TABLE
語句中使用IF NOT EXIST
子句。 將資料從現有表複製到新的表的完整命令如下:
CREATE TABLE new_table
SELECT col1, col2, col3
FROM
existing_table
WHERE
conditions;
請注意,上面的宣告只是複製表及其資料。它不會複製與表關聯的其他資料庫物件,如索引,主鍵約束,外來鍵約束,觸發器等。
要從表中複製資料以及表的所有依賴物件,請使用以下語句:
CREATE TABLE IF NOT EXISTS new_table LIKE existing_table;
INSERT new_table
SELECT * FROM existing_table;
上面查詢中,需要執行兩個語句。第一個語句通過複製existing_table
表來建立一個新表new_table
。 第二個語句將現有existing_table
表中的資料插入到new_table
中。
以下語句將資料從office
表複製到範例資料(yiibaidb
)庫中指定名為offices_bk
的新表。
USE yiibaidb;
CREATE TABLE IF NOT EXISTS offices_bk
SELECT * FROM
offices;
可以通過查詢office_bk
表中的資料來驗證副本,如下所示:
SELECT
*
FROM
offices_bk;
執行上面查詢,得到以下結果 -
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
| officeCode | city | phone | addressLine1 | addressLine2 | state | country | postalCode | territory |
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
| 1 | San Francisco | +1 650 219 4782 | 100 Market Street | Suite 300 | CA | USA | 94080 | NA |
| 2 | Boston | +1 215 837 0825 | 1550 Court Place | Suite 102 | MA | USA | 02107 | NA |
| 3 | NYC | +1 212 555 3000 | 523 East 53rd Street | apt. 5A | NY | USA | 10022 | NA |
| 4 | Paris | +33 14 723 4404 | 43 Rue Jouffroy Dabbans | NULL | NULL | France | 75017 | EMEA |
| 5 | Beijing | +86 33 224 5000 | 4-1 Haidian Area | NULL | BJ | China | 110000 | NA |
| 6 | Sydney | +61 2 9264 2451 | 5-11 Wentworth Avenue | Floor #2 | NULL | Australia | NSW 2010 | APAC |
| 7 | London | +44 20 7877 2041 | 25 Old Broad Street | Level 7 | NULL | UK | EC2N 1HN | EMEA |
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
7 rows in set
如果我們想僅複製在美國(USA
)辦公室,可以將WHERE
子句新增到SELECT
語句中,如下所示:
USE yiibaidb;
CREATE TABLE IF NOT EXISTS offices_usa
SELECT *
FROM
offices
WHERE
country = 'USA';
驗證上面查詢執行,得到以下結果 -
SELECT *
FROM
offices
WHERE
country = 'USA';
+------------+---------------+-----------------+----------------------+--------------+-------+---------+------------+-----------+
| officeCode | city | phone | addressLine1 | addressLine2 | state | country | postalCode | territory |
+------------+---------------+-----------------+----------------------+--------------+-------+---------+------------+-----------+
| 1 | San Francisco | +1 650 219 4782 | 100 Market Street | Suite 300 | CA | USA | 94080 | NA |
| 2 | Boston | +1 215 837 0825 | 1550 Court Place | Suite 102 | MA | USA | 02107 | NA |
| 3 | NYC | +1 212 555 3000 | 523 East 53rd Street | apt. 5A | NY | USA | 10022 | NA |
+------------+---------------+-----------------+----------------------+--------------+-------+---------+------------+-----------+
3 rows in set
假設不僅要複製資料,還要複製與offices
表相關聯的所有資料庫物件,我們使用以下語句:
CREATE TABLE offices_dup LIKE offices;
INSERT office_dup
SELECT * FROM offices;
有時,您要將表複製到其他資料庫。 在這種情況下,可使用以下語句:
CREATE TABLE destination_db.new_table
LIKE source_db.existing_table;
INSERT destination_db.new_table
SELECT *
FROM source_db.existing_table;
第一個語句通過從源資料庫(source_db
)複製現有表(existing_table
)到目標資料庫(destination_db
)中建立一個新表new_table
。
第二個語句將資料從源資料庫中的現有(existing_table
)表複製到目標資料庫中的新表。
下面來看看看下面的例子。
首先,我們使用以下語句建立一個名為testdb
的資料庫:
CREATE DATABASE IF NOT EXISTS testdb;
其次,通過將其結構從範例資料庫(yiibaidb
)中的offices
表複製出來,在testdb
中建立了offices
表。
CREATE TABLE testdb.offices LIKE yiibaidb.offices;
第三,我們將資料從yiibaidb.offices
表複製到testdb.offices
表中。
INSERT testdb.offices
SELECT *
FROM yiibaidb.offices;
我們來驗證testdb.offices
表中的資料。
SELECT
*
FROM
testdb.offices;
執行上面查詢語句,得到以下結果 -
mysql> SELECT
*
FROM
testdb.offices;
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
| officeCode | city | phone | addressLine1 | addressLine2 | state | country | postalCode | territory |
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
| 1 | San Francisco | +1 650 219 4782 | 100 Market Street | Suite 300 | CA | USA | 94080 | NA |
| 2 | Boston | +1 215 837 0825 | 1550 Court Place | Suite 102 | MA | USA | 02107 | NA |
| 3 | NYC | +1 212 555 3000 | 523 East 53rd Street | apt. 5A | NY | USA | 10022 | NA |
| 4 | Paris | +33 14 723 4404 | 43 Rue Jouffroy Dabbans | NULL | NULL | France | 75017 | EMEA |
| 5 | Beijing | +86 33 224 5000 | 4-1 Haidian Area | NULL | BJ | China | 110000 | NA |
| 6 | Sydney | +61 2 9264 2451 | 5-11 Wentworth Avenue | Floor #2 | NULL | Australia | NSW 2010 | APAC |
| 7 | London | +44 20 7877 2041 | 25 Old Broad Street | Level 7 | NULL | UK | EC2N 1HN | EMEA |
+------------+---------------+------------------+--------------------------+--------------+-------+-----------+------------+-----------+
7 rows in set
在本教學中,我們向您展示了將資料庫中的表和從一個資料庫複製到另一個資料庫的各種技術。