第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將行匯出到一個新表。