MySQL必知必會十九:插入數據

19.1 數據插入

顧名思義, INSERT是用來插入(或添加)行到數據庫表的。插入可以用幾種方式使用:

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

插入及系統安全 可針對每個表或每個用戶,利用MySQL的安全機制禁止使用INSERT語句

19.2 插入完整的行

把數據插入表中的最簡單的方法是使用基本的INSERT語法,它要求指定表名和被插入到新行中的值。下面舉一個例子:

mysql> INSERT INTO Customers VALUES(NULL, 'Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);
Query OK, 1 row affected (0.37 sec)

沒有輸出 INSERT語句一般不會產生輸出。

  • 分析:此例子插入一個新客戶到customers表。存儲到每個表列中的數據在VALUES子句中給出,對每個列必須提供一個值。如果某個列沒有值(如上面的cust_contact和cust_email列),應該使用NULL值(假定表允許對該列指定空值)。各個列必須以它們在表定義中出現的次序填充。第一列cust_id也爲NULL。這是因爲每次插入一個新行時,該列由MySQL自動增量。你不想給出一個值(這是MySQL的工作),又不能省略此列(如前所述,必須給出每個列),所以指定一個NULL值(它被MySQL忽略, MySQL在這裏插入下一個可用的cust_id值)。

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

mysql> INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country, cust_contact, cust_email) VALUES('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA', NULL, NULL);
Query OK, 1 row affected (0.23 sec)
  • 分析:此例子完成與前一個INSERT語句完全相同的工作,但在表名後的括號裏明確地給出了列名。在插入行時, MySQL將用VALUES列表中的相應值填入列表中的對應項。 VALUES中的第一個值對應於第一個指定的列名。第二個值對應於第二個列名,如此等等。因爲提供了列名, VALUES必須以其指定的次序匹配指定的列名,不一定按各個列出現在實際表中的次序。其優點是,即使表的結構改變,此INSERT語句仍然能正確工作。你會發現cust_id的NULL值是不必要的,cust_id列並沒有出現在列表中,所以不需要任何值。

使用這種語法,還可以省略列。這表示可以只給某些列提供值,給其他列不提供值。(事實上你已經看到過這樣的例子:當列名被明確列出時, cust_id可以省略。)

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

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

如果對錶中不允許NULL值且沒有默認值的列不給出值,則MySQL將產生一條錯誤消息,並且相應的行插入不成功。

19.3 插入多個行

INSERT可以插入一行到一個表中。但如果你想插入多個行怎麼辦?可以使用多條INSERT語句,甚至一次提交它們,每條語句用一個分號結束,如下所示:

mysql> INSERT INTO customers(cust_name, cust_address, cust_city, cust_state, cust_zip, cust_country) VALUES('Pep E. LaPew', '100 Main Street', 'Los Angeles', 'CA', '90046', 'USA'), ('M. Martian', '42 Galaxy Way', 'New York', 'NY', '11213', 'USA');
Query OK, 2 rows affected (0.11 sec)
Records: 2  Duplicates: 0  Warnings: 0
  • 分析:其中單條INSERT語句有多組值,每組值用一對圓括號括起來,用逗號分隔。

19.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;
  • 分析:這個例子使用INSERT SELECT從custnew中將所有數據導入customers。 SELECT語句從custnew檢索出要插入的值,而不是列出它們。 SELECT中列出的每個列對應於customers表名後所跟的列表中的每個列。這條語句將插入多少行有賴於custnew表中有多少行。如果這個表爲空,則沒有行被插入(也不產生錯誤,因爲操作仍然是合法的)。如果這個表確實含有數據,則所有數據將被插入到customers。這個例子導入了cust_id(假設你能夠確保cust_id的值不重複)。你也可以簡單地省略這列(從INSERT和SELECT中),這樣MySQL就會生成新值。

INSERT SELECT中的列名 爲簡單起見,這個例子在INSERT和SELECT語句中使用了相同的列名。但是,不一定要求列名匹配。事實上, MySQL甚至不關心SELECT返回的列名。它使用的是列的位置,因此SELECT中的第一列(不管其列名)將用來填充表列中指定的第一個列,第二列將用來填充表列中指定的第二個列,如此等等。這對於從使用不同列名的表中導入數據是非常有用的。

INSERT SELECT中SELECT語句可包含WHERE子句以過濾插入的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章