很多時候,我們可能需要將資料從一個現有的資料表複製到一個新的資料表中,例如,備份資料,或就像為了測試將一個環境中的資料複製到另一個環境中。在 SQL 中,通常會使用以下的 CREATE TABLE 和 SELECT 陳述式:
CREATE TABLE new_table; SELECT SELECT col, col2, col3 INTO new_table FROM existing_table;
在第一個陳述式中,資料庫使用 CREATE TABLE 陳述式中指定的名稱建立一個新資料表。 新資料表的結構由 SELECT 陳述式的結果集定義。然後,資料庫將 SELECT 陳述式的結果擴展到新資料表中。
儘管上述的程序可以完美地複製資料表,但是有一種更簡單的方法,我們可以使用 CREATE TABLE 陳述式的變體將資料表複製到新資料表中!今天我們將在這裡學習如何使用它。
介紹 CREATE TABLE AS SELECT 陳述式
CREATE TABLE 陳述式提供了一種方法從另一個資料表建立資料表。這種方法就是在 CREATE TABLE 陳述式的最尾加入 SELECT 陳述式。該陳述式的完整語法是這樣:
CREATE TABLE new_tbl [AS] SELECT * FROM orig_tbl;
這種方法只需一行程式碼,與我們在上面使用兩個單獨的陳述式所做的操作完全相同。
複製部分資料
由於 SELECT 陳述式支援你通常在 SQL 陳述式中使用的所有子句,包括 WHERE 和 ORDER BY 子句,因此我們可以透過在陳述式中提供條件來限制要複製的內容。以下是它的語法:
CREATE TABLE new_table SELECT col1, col2, col3 FROM existing_table WHERE conditions;
一些範例
以下是幾個使用 Navicat Premium 作為資料庫用戶端的範例:
在最基本的形式中,CREATE TABLE AS SELECT 陳述式可以使用 SELECT All (*) 根據原樣複製資料表。這是一個範例:

這是一個更複雜的範例,該範例僅從 orders 資料表中複製三欄,並將列限制為具有最近的 requiredDate 的列:

我們可以看到新資料表只有三欄被選取:

總結
毫無疑問,CREATE TABLE AS SELECT 陳述式提供了一種快速簡便的方法來將資料從一個資料表複製到新資料表中。話雖如此,它確實有其局限性。首先,並不是所有的關聯式資料庫都支援它。我知道 MySQL 和 SQL Server 支援,但是其他資料庫可能支援也可能不支援。
還值得注意的是,CREATE TABLE AS SELECT 陳述式只是複製資料表及其資料。它不會複製與資料表有關聯的其他資料庫物件,例如索引、主鍵索引條件約束、外部索引鍵條件約束、觸發器等。為了不單只複製資料,並同時複製與資料表有關聯的所有資料庫物件,我們應該使用以下兩個單獨的陳述式:
CREATE TABLE orders_copy LIKE orders; INSERT orders_copy SELECT * FROM orders;
如果你對 Navicat Premium 感興趣,可以免費試用 14 天!