MYSQL INSERT INTO語句

來源:互聯網
上載者:User

INSERT INTO語句:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...

INSERT INTO SELECT語句:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...

INSERT INTO語句:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] tbl_name
SET col_name=expression, col_name=expression, ...

INSERT把新行插入到一個存在的表中,INSERTINTO... VALUES形式的語句基於明確指定的值插入行,INSERT INTO SELECT形式插入從其他表選擇的行,有多個值表的INSERT INTO... VALUES的形式在MySQL 3.22.5或以後版本中支援,col_name=expression文法在MySQL 3.22.10或以後版本中支援。

tbl_name是行應該被插入其中的表。列名表或SET子句指出語句為那一列指定值。

如果你為INSERT ... VALUES或INSERT ... SELECT不指定列表,所有列的值必須在VALUES()表或由SELECT提供。如果你不知道表中列的順序,使用DESCRIBE tbl_name來找出。
任何沒有明確地給出值的列被設定為它的預設值。例如,如果你指定一個列表並沒命名表中所有列,未命名的列被設定為它們的預設值。預設值賦值在7.7 CREATE TABLE句法中描述。
一個expression可以引用在一個值表先前設定的任何列。例如,你能這樣:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);

但不能這樣:

mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);

如果你指定關鍵詞LOW_PRIORITY,INSERT的執行被延遲到沒有其他客戶正在讀取表。在這種情況下,客戶必須等到插入陳述式完成後,如果表頻繁使用,它可能花很長時間。這與INSERT DELAYED讓客馬上繼續正好相反。
如果你在一個有許多值行的INSERT中指定關鍵詞IGNORE,表中任何複製一個現有PRIMARY或UNIQUE鍵的行被忽略並且不被插入。如果你不指定IGNORE,插入如果有任何複製現有關索引值的行被放棄。你可用C API函數mysql_info()檢查多少行被插入到表中。
如果MySQL用DONT_USE_DEFAULT_FIELDS選項配置,INSERT語句產生一個錯誤,除非你明確對需要一個非NULL值的所有列指定值。見4.7.3 典型configure選項。
INSERT INTO ... SELECT語句滿足下列條件:
查詢不能包含一個ORDER BY子句。
INSERT語句的目的表不能出現在SELECT查詢部分的FROM子句,因為這在ANSI SQL中被禁止讓從你正在插入的表中SELECT。(問題是SELECT將可能發現在同一個運行期間內先前被插入的記錄。當使用子選擇子句時,情況能很容易混淆)
AUTO_INCREMENT列象往常一樣工作。
如果你使用INSERT ... SELECT或INSERT ... VALUES語句有多個值列表,你可以使用C API函數mysql_info()得到查詢的資訊。資訊字串的格式如下:

Records: 100 Duplicates: 0 Warnings: 0
Duplicates指出不能被插入的行的數量,因為他們與現有的唯一的索引值重複。Warnings指出在出現某些問題時嘗試插入列值的次數。在下列任何條件下都可能發生錯誤:

插入NULL到被聲明了NOT NULL的列,列被設定為它的預設值。
將超出列範圍的值設定給一個數字列,值被剪下為範圍內適當的端點值。
將數字列設成例如'10.34 a'的值,拖尾的垃圾被剝去並仍然是數字部分被插入。如果值根本不是一個數字,列被設定到0。
把一個字串插入到超過列的最大長度的一個CHAR、VARCHAR、TEXT或BLOB列中。值被截斷為列的最大長度。
把一個對列類型不合法的值插入到一個日期或時間列。列被設定為該列類型適當的“零”值。
對於INSERT語句的DELAYED選項是MySQL專屬的選項-如果你客戶有不能等到INSERT完成,它是很有用的。當你為日記登入使用MySQL時,而且你也周期性地運行花很長時間完成的SELECT語句,這是一個常見的問題。DELAYED在面MySQL 3.22.15中被引入,它是MySQL對 ANSI SQL92 的一個擴充。

當你使用INSERT DELAYED時,客戶將馬上準備好,並且當表不被任何其他的線程使用時,行將被插入。

另一個使用INSERT DELAYED的主要好處是從很多客戶插入被捆綁在一起並且寫進一個塊。這比做很多單獨的插入要來的快。

注意,當前排隊的行只是儲存在記憶體中,直到他們被插入到表中。這意味著,如果你硬要殺死mysqld(kill -9)或如果mysqld出人意料地死掉,沒被寫進磁碟的任何排隊的行被丟失!

下列詳細描述當你為INSERT或REPLACE使用DELAYED選項時,發生什麼。在這個描述中,“線程”是收到一個INSERT DELAYED命令的線程並且“處理器”是處理所有對於一個特定表的INSERT DELAYED語句。

當一個線程對一個表執行一個DELAYED語句時,如果不存在這樣的處理常式,一個處理器線程被建立以處理對於該表的所有DELAYED語句。
線程檢查處理常式是否已經獲得了一個DELAYED鎖;如果沒有,它告訴處理常式去獲得。即使其他的線程有在表上的一個READ或WRITE鎖,也能獲得DELAYED鎖。然而,處理常式將等待所有ALTER TABLE鎖或FLUSH TABLES以保證表結構是最新的。
線程執行INSERT語句,但不是將行寫入表,它把最後一行的副本放進被處理器線程管理的一個隊列。任何語法錯誤都能被線程發覺並報告給客戶程式。
顧客不能報告結果行的重複次數或AUTO_INCREMENT值;它不能從伺服器獲得它們,因為INSERT在插入操作完成前返回。如果你使用C API,同樣原因,mysql_info()函數不返回任何有意義的東西。
當行被插入到表中時,更新日誌有處理器線程更新。在多行插入的情況下,當第一行被插入時,更新日誌被更新。
在每寫入delayed_insert_limit行後,處理器檢查是否任何SELECT語句仍然是未完成,如果這樣,在繼續之前允許執行這些語句。
當處理器在它的隊列中沒有更多行時,表被解鎖。如果在delayed_insert_timeout秒內沒有收到新的INSERT DELAYED命令,處理器終止。
如果已經有多於delayed_queue_size行在一個特定的處理器隊列中未解決,線程等待直到隊列有空間。這有助於保證mysqld伺服器對延遲的記憶體隊列不使用所有記憶體。
處理器線程將在Command列的MySQL進程表中顯示delayed_insert。如果你執行一個FLUSH TABLES命令或以KILL thread_id殺死它,它將被殺死,然而,它在退出前首先將所有排隊的行存進表中。在這期間,這次它將不從其他線程接受任何新的INSERT命令。如果你在它之後執行一個INSERT DELAYED,將建立一個新的處理器線程。
注意,上述意味著,如果有一個INSERT DELAYED處理器已經運行,INSERT DELAYED命令有比正常INSERT更高的優先順序!其他更新命令將必須等到INSERT DELAY排隊變空、殺死處理器線程(用KILL thread_id)或執行FLUSH TABLES。
下列狀態變數提供了關於INSERT DELAYED命令的資訊: Delayed_insert_threads 處理器線程數量
Delayed_writes 用INSERT DELAYED被寫入的行的數量
Not_flushed_delayed_rows 等待被寫入的行數字

你能通過發出一個SHOW STATUS語句或通過執行一個mysqladmin extended-status命令察看這些變數。

注意如果表不在使用,INSERT DELAYED比一個正常的INSERT慢。對伺服器也有額外開銷來處理你對它使用INSERT DELAYED的每個表的一個單獨線程。這意味著,你應該只在你確實肯定需要它的時候才使用INSERT DELAYED!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.