1. 程式人生 > 實用技巧 >第15課 插入資料

第15課 插入資料

第15課 插入資料

15.1 資料插入

插入有幾種方式:

  • 插入完整的行;
  • 插入行的一部分;
  • 插入某些查詢的結果。

15.1.1 插入完整的行

把資料插入表中的最簡單方法是使用基本的INSERT語法,它要求指定表名和插入到新行中的值。

INSERT INTO Customers
VALUES('1000000006',
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA',
       NULL,
       NULL);

上面的SQL語句高度依賴於表中列的定義次序,還依賴於其容易獲得的次序資訊。即使可以得到這種次序資訊,也不能保證各列在下一次表結構變動後保持完全相同的次序。因此,編寫依賴於特定列次序的SQL語句是很不安全的,這樣做遲早會出問題。

編寫INSERT語句的更安全(不過更煩瑣)的方法如下:

INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country,
                      cust_contact,
                      cust_email)
VALUES('1000000006',
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA',
       NULL,
       NULL);

下面的INSERT語句填充所有列(與前面的一樣),但以一種不同的次序填充。因為給出了列名,所以插入結果仍然正確:

INSERT INTO Customers(cust_id,
                      cust_contact,
                      cust_email,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip)
VALUES('1000000006',
       NULL,
       NULL,
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111');

15.1.2 插入部分行

可以只給某些列提供值,給其他列不提供值。

INSERT INTO Customers(cust_id,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country)
VALUES('1000000006',
       'Toy Land',
       '123 Any Street',
       'New York',
       'NY',
       '11111',
       'USA');

警告:省略列
如果表的定義允許,則可以在INSERT操作中省略某些列。省略的列必須滿足以下某個條件。

  • 該列定義為允許NULL值(無值或空值)。
  • 在表定義中給出預設值。這表示如果不給出值,將使用預設值。

如果對錶中不允許NULL值且沒有預設值的列不給出值,DBMS將產生錯誤訊息,並且相應的行插入不成功。

15.1.3 插入檢索出的資料

INSERT還存在另一種形式,可以利用它將SELECT語句的結果插入表中,這就是所謂的INSERT SELECT。

假如想把另一表中的顧客列合併到Customers表中。不需要每次讀取一行再將它用INSERT插入,可以如下進行:

INSERT INTO Customers(cust_id,
                      cust_contact,
                      cust_email,
                      cust_name,
                      cust_address,
                      cust_city,
                      cust_state,
                      cust_zip,
                      cust_country)
SELECT cust_id,
       cust_contact,
       cust_email,
       cust_name,
       cust_address,
       cust_city,
       cust_state,
       cust_zip,
       cust_country
FROM CustNew;

提示:INSERT SELECT中的列名
為簡單起見,這個例子在INSERT和SELECT語句中使用了相同的列名。但是,不一定要求列名匹配。事實上,DBMS一點兒也不關心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)將用來填充表列中指定的第一列,第二列將用來填充表列中指定的第二列,如此等等。

提示:插入多行
INSERT通常只插入一行。要插入多行,必須執行多個INSERT語句。INSERT SELECT是個例外,它可以用一條INSERT插入多行,不管SELECT語句返回多少行,都將被INSERT插入。

15.2 從一個表複製到另一個表

要將一個表的內容複製到一個全新的表(執行中建立的表),可以使用SELECT INTO語句。

說明:DB2不支援
DB2不支援這裡描述的SELECT INTO。

與INSERT SELECT將資料新增到一個已經存在的表不同,SELECT INTO將資料複製到一個新表(有的DBMS可以覆蓋已經存在的表,這依賴於所使用的具體DBMS)。

SELECT *
INTO CustCopy
FROM Customers;

這條SELECT語句建立一個名為CustCopy的新表,並把Customers表的整個內容複製到新表中。因為這裡使用的是SELECT *,所以將在CustCopy表中建立(並填充)與Customers表的每一列相同的列。要想只複製部分的列,可以明確給出列名,而不是使用*萬用字元。

MariaDB、MySQL、Oracle、PostgreSQL和SQLite使用的語法稍有不同:

CREATE TABLE CustCopy AS
SELECT * FROM Customers;

提示:進行表的複製
SELECT INTO是試驗新SQL語句前進行表複製的很好工具。先進行復制,可在複製的資料上測試SQL程式碼,而不會影響實際的資料。

15.3 小結

我們學習了使用INSERT的幾種方法,為什麼要明確使用列名,如何用INSERT SELECT從其他表中匯入行,如何用SELECT INTO將行匯出到一個新表。