MySQL必知必會——第19章 插入數據

本章介紹如何利用SQL的insert語句將數據插入表中。
1 數據插入
select是最常使用的SQL語句了,還有其他3個經常使用的SQL語句需要學習,第一個就是insert。
insert是用來插入(或添加)行到數據庫表的。插入可以用幾種方式使用:
①插入完整的行
②插入行的一部分
③插入多行
④插入某些查詢的結果
插入及系統安全:可針對每個表或每個用戶,利用MySQL的安全機制禁止使用insert語句。
2 插入完整的行
使用基本的insert語法, 要求指定表名和被插入到新行中的值。
在這裏插入圖片描述
上述例子插入一個新客戶到Customers表。存儲到每個表列中的數據在VALUES子句中給出,對每個列必須提供一個值。如果某個列沒有值,應該使用NULL值。各個列必須以它們在表定義中出現的次序填充。第一列cust_id也爲NULL,這是因爲每次插入一個新行,該列由MySQL自動增量,你不想給出一個值,又不能省略此列(如前所述,必須給出每個列),所以指定一個NULL值(它被MySQL忽略,MySQL在這裏插入下一個可用的cust_id值)。
編寫依賴於特定列次序的SQL語句是很不安全的。
編寫insert語句更安全(不過更繁瑣)的方法如下:
在這裏插入圖片描述
在這裏插入圖片描述
此例子在表名後的括號中明確給出了列名。在插入行時,MySQL將用values列表中的相應值填入列表中的對應項。
因爲提供了列名,values必須以其指定的次序匹配指定的列名,不一定按照各個列出現在實際表中的次序。優點是即使表的結構改變,此insert語句仍然能夠正確工作。你會發現cust_id的NULL值是不必要的,cust_id列並沒有出現在列表中,所以不需要任何值。
下面的insert語句填充所有列(與前面一樣),但以一種不同的次序填充。因爲給出了列名,所以插入結果仍然正確。
在這裏插入圖片描述
一般不要使用沒有明確給出列的列表的insert語句。使用列的列表能使SQL語句繼續發揮作用,即使表結構發生了變化。
不管使用哪種insert語法, 都必須給出values的正確數目。如果不提供列名,則必須給每個表列提供一個值。如果提供列名,則必須對每個列出的列給出一個值。如果不這樣,將產生一條錯誤信息,相應的行插入不成功。
使用這種語法,還可以省略列。這表示可以只給某些列提供值,給其他列不提供值。如果表的定義允許,則可以在insert操作中省略某些列,省略的列必須滿足以下某個條件:
①該列定義爲允許NULL值
②在表定義中給出默認值。
如果對錶中不允許NULL值且沒有默認值的列不給出值,則MySQL將產生一條錯誤信息,並且相應的插入不成功。
insert操作可能很耗時(特別是有很多索引需要更新時),而且它可能降低等待處理的select語句的性能。如果數據檢索是最重要的(通常是這樣),則你可以通過在insert和into之間添加關鍵字LOW_PRIORITY,指示MySQL降低insert語句的優先級。這也適用於update和delete。
3 插入多個行
方式一:使用多條insert語句,每次語句用一個分號結束;
在這裏插入圖片描述
方式二:只要每條insert語句中的列名(和次序)相同,可以單條insert語句有多組值,每組值用一對圓括號括起來,用逗號分隔。
在這裏插入圖片描述
在這裏插入圖片描述
方式二可以提高數據庫處理的性能,因爲MySQL用單條insert語句處理多個插入比使用多條insert語句快。
4 插入檢索出的數據
insert一般用來給表插入一個指定列值的行。但是insert還存在另一種形式,可以利用它將一條select語句的結果插入表中。這就是所謂的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;

select中列出的每個列對應於customers表名後所跟的列表中的每個列。如果檢索出的結果爲空,則沒有行被插入(也不產生錯誤,因爲操作是合法的)。如果這個表確實含有數據,則所有數據將被插入customers。
上述例子在insert和select語句中使用了相同的列名。但是不一定要求列名匹配,事實上MySQL甚至不關係select返回的列名。它使用的是列的位置,因此在select中的第一列(不管其列名)將用來填充表列中指定的第一個列,第二個列將用來填充表列中指定的第二個列,如此等等。這對於從使用不同列名的表中導入數據是非常有用的。
insert select中select語句可包含where子句以過濾插入的數據。

發佈了95 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章