《Mysql學習Mysql INSERT INTO語句用法詳解》要點:
本文介紹了Mysql學習Mysql INSERT INTO語句用法詳解,希望對您有用。如果有疑問,可以聯系我們。
mysql數據庫中,INSERT INTO語句的結構:
?MYSQL數據庫
INSERT INTO SELECT語句:
?MYSQL數據庫
INSERT INTO語句:
?MYSQL數據庫
INSERT把新行插入到一個存在的表中,INSERTINTO... VALUES形式的語句基于明確指定的值插入行,INSERT INTO SELECT形式插入從其他表選擇的行,有多個值表的INSERT INTO... VALUES的形式在MySQL 3.22.5或以后版本中支持,col_name=expression語法在MySQL 3.22.10或以后版本中支持.MYSQL數據庫
tbl_name是行應該被插入其中的表.列名表或SET子句指出語句為那一列指定值.MYSQL數據庫
如果為INSERT ... VALUES或INSERT ... SELECT不指定列表,所有列的值必須在VALUES()表或由SELECT提供.如果不知道表中列的順序,使用DESCRIBE tbl_name來找出.
任何沒有明確地給出值的列被設置為它的缺省值.MYSQL數據庫
例如,如果指定一個列表并沒命名表中所有列,未命名的列被設置為它們的缺省值.缺省值賦值在7.7 CREATE TABLE句法中描述.
一個expression可以引用在一個值表先前設置的任何列.
例如:
?MYSQL數據庫
但不能這樣:
?MYSQL數據庫
如果指定關鍵詞LOW_PRIORITY,INSERT的執行被推遲到沒有其他客戶正在讀取表.
在這種情況下,客戶必須等到插入語句完成后,如果表頻繁使用,它可能花很長時間.這與INSERT DELAYED讓客馬上繼續正好相反.MYSQL數據庫
如果在一個有許多值行的INSERT中指定關鍵詞IGNORE,表中任何復制一個現有PRIMARY或UNIQUE鍵的行被忽略并且不被插入.
如果不指定IGNORE,插入如果有任何復制現有關鍵值的行被放棄.可用C API函數mysql_info()檢查多少行被插入到表中.
如果MySQL用DONT_USE_DEFAULT_FIELDS選項配置,INSERT語句產生一個錯誤,除非明確對需要一個非NULL值的所有列指定值.MYSQL數據庫
INSERT INTO ... SELECT語句滿足下列條件:
查詢不能包含一個ORDER BY子句.MYSQL數據庫
INSERT語句的目的表不能出現在SELECT查詢部分的FROM子句,因為這在ANSI SQL中被禁止讓從正在插入的表中SELECT.(問題是SELECT將可能發現在同一個運行期間內先前被插入的記錄.當使用子選擇子句時,情況能很容易混淆)MYSQL數據庫
AUTO_INCREMENT列象往常一樣工作.
如果使用INSERT ... SELECT或INSERT ... VALUES語句有多個值列表,可以使用C API函數mysql_info()得到查詢的信息.
信息字符串的格式如下:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates指出不能被插入的行的數量,因為他們與現有的唯一的索引值重復.Warnings指出在出現某些問題時嘗試插入列值的次數.在下列任何條件下都可能發生錯誤:MYSQL數據庫
插入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 的一個擴展.MYSQL數據庫
當使用INSERT DELAYED時,客戶將馬上準備好,并且當表不被任何其他的線程使用時,行將被插入.MYSQL數據庫
另一個使用INSERT DELAYED的主要好處是從很多客戶插入被捆綁在一起并且寫進一個塊.這比做很多單獨的插入要來的快.MYSQL數據庫
注意,當前排隊的行只是存儲在內存中,直到他們被插入到表中.這意味著,如果硬要殺死mysqld(kill -9)或如果mysqld出人意料地死掉,沒被寫進磁盤的任何排隊的行被丟失!MYSQL數據庫
下列詳細描述當為INSERT或REPLACE使用DELAYED選項時,發生什么.在這個描述中,“線程”是收到一個INSERT DELAYED命令的線程并且“處理器”是處理所有對于一個特定表的INSERT DELAYED語句.MYSQL數據庫
當一個線程對一個表執行一個DELAYED語句時,如果不存在這樣的處理程序,一個處理器線程被創建以處理對于該表的所有DELAYED語句.
線程檢查處理程序是否已經獲得了一個DELAYED鎖;如果沒有,它告訴處理程序去獲得.即使其他的線程有在表上的一個READ或WRITE鎖,也能獲得DELAYED鎖.然而,處理程序將等待所有ALTER TABLE鎖或FLUSH TABLES以保證表結構是最新的.MYSQL數據庫
線程執行INSERT語句,但不是將行寫入表,它把最后一行的副本放進被處理器線程管理的一個隊列.任何語法錯誤都能被線程發覺并報告給客戶程序.
顧客不能報告結果行的重復次數或AUTO_INCREMENT值;它不能從服務器獲得它們,因為INSERT在插入操作完成前返回.如果使用C API,同樣原因,mysql_info()函數不返回任何有意義的東西.MYSQL數據庫
當行被插入到表中時,更新日志有處理器線程更新.在多行插入的情況下,當第一行被插入時,更新日志被更新.
在每寫入delayed_insert_limit行后,處理器檢查是否任何SELECT語句仍然是未完成,如果這樣,在繼續之前允許執行這些語句.MYSQL數據庫
當處理器在它的隊列中沒有更多行時,表被解鎖.如果在delayed_insert_timeout秒內沒有收到新的INSERT DELAYED命令,處理器終止.
如果已經有多于delayed_queue_size行在一個特定的處理器隊列中未辦理,線程等待直到隊列有空間.這有助于保證mysqld服務器對延遲的內存隊列不使用所有內存.MYSQL數據庫
處理器線程將在Command列的MySQL進程表中顯示delayed_insert.如果執行一個FLUSH TABLES命令或以KILL thread_id殺死它,它將被殺死,然而,它在退出前首先將所有排隊的行存進表中.在這期間,這次它將不從其他線程接受任何新的INSERT命令.如果在它之后執行一個INSERT DELAYED,將創建一個新的處理器線程.MYSQL數據庫
注意,如果有一個INSERT DELAYED處理器已經運行,INSERT DELAYED命令有比正常INSERT更高的優先級!其他更新命令將必須等到INSERT DELAY排隊變空、殺死處理器線程(用KILL thread_id)或執行FLUSH TABLES.MYSQL數據庫
以下的狀態變量提供了關于INSERT DELAYED命令的信息: Delayed_insert_threads 處理器線程數量
Delayed_writes 用INSERT DELAYED被寫入的行的數量
Not_flushed_delayed_rows 等待被寫入的行數字MYSQL數據庫
能通過發出一個SHOW STATUS語句或通過執行一個mysqladmin extended-status命令察看這些變量.MYSQL數據庫
注意,如果表不在使用,INSERT DELAYED比一個正常的INSERT慢.
對服務器也有額外開銷來處理對它使用INSERT DELAYED的每個表的一個單獨線程.
也就是說,應該只在確實肯定需要它的時候才使用INSERT DELAYED!MYSQL數據庫
以上就是MYSQL INSERT INTO語句用法的全部內容,希望對大家有所贊助.MYSQL數據庫
維易PHP培訓學院每天發布《Mysql學習Mysql INSERT INTO語句用法詳解》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。