《Mysql學(xué)習(xí)Mysql INSERT INTO語(yǔ)句用法詳解》要點(diǎn):
本文介紹了Mysql學(xué)習(xí)Mysql INSERT INTO語(yǔ)句用法詳解,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
mysql數(shù)據(jù)庫(kù)中,INSERT INTO語(yǔ)句的結(jié)構(gòu):
?MYSQL數(shù)據(jù)庫(kù)
INSERT INTO SELECT語(yǔ)句:
?MYSQL數(shù)據(jù)庫(kù)
INSERT INTO語(yǔ)句:
?MYSQL數(shù)據(jù)庫(kù)
INSERT把新行插入到一個(gè)存在的表中,INSERTINTO... VALUES形式的語(yǔ)句基于明確指定的值插入行,INSERT INTO SELECT形式插入從其他表選擇的行,有多個(gè)值表的INSERT INTO... VALUES的形式在MySQL 3.22.5或以后版本中支持,col_name=expression語(yǔ)法在MySQL 3.22.10或以后版本中支持.MYSQL數(shù)據(jù)庫(kù)
tbl_name是行應(yīng)該被插入其中的表.列名表或SET子句指出語(yǔ)句為那一列指定值.MYSQL數(shù)據(jù)庫(kù)
如果為INSERT ... VALUES或INSERT ... SELECT不指定列表,所有列的值必須在VALUES()表或由SELECT提供.如果不知道表中列的順序,使用DESCRIBE tbl_name來找出.
任何沒有明確地給出值的列被設(shè)置為它的缺省值.MYSQL數(shù)據(jù)庫(kù)
例如,如果指定一個(gè)列表并沒命名表中所有列,未命名的列被設(shè)置為它們的缺省值.缺省值賦值在7.7 CREATE TABLE句法中描述.
一個(gè)expression可以引用在一個(gè)值表先前設(shè)置的任何列.
例如:
?MYSQL數(shù)據(jù)庫(kù)
但不能這樣:
?MYSQL數(shù)據(jù)庫(kù)
如果指定關(guān)鍵詞LOW_PRIORITY,INSERT的執(zhí)行被推遲到?jīng)]有其他客戶正在讀取表.
在這種情況下,客戶必須等到插入語(yǔ)句完成后,如果表頻繁使用,它可能花很長(zhǎng)時(shí)間.這與INSERT DELAYED讓客馬上繼續(xù)正好相反.MYSQL數(shù)據(jù)庫(kù)
如果在一個(gè)有許多值行的INSERT中指定關(guān)鍵詞IGNORE,表中任何復(fù)制一個(gè)現(xiàn)有PRIMARY或UNIQUE鍵的行被忽略并且不被插入.
如果不指定IGNORE,插入如果有任何復(fù)制現(xiàn)有關(guān)鍵值的行被放棄.可用C API函數(shù)mysql_info()檢查多少行被插入到表中.
如果MySQL用DONT_USE_DEFAULT_FIELDS選項(xiàng)配置,INSERT語(yǔ)句產(chǎn)生一個(gè)錯(cuò)誤,除非明確對(duì)需要一個(gè)非NULL值的所有列指定值.MYSQL數(shù)據(jù)庫(kù)
INSERT INTO ... SELECT語(yǔ)句滿足下列條件:
查詢不能包含一個(gè)ORDER BY子句.MYSQL數(shù)據(jù)庫(kù)
INSERT語(yǔ)句的目的表不能出現(xiàn)在SELECT查詢部分的FROM子句,因?yàn)檫@在ANSI SQL中被禁止讓從正在插入的表中SELECT.(問題是SELECT將可能發(fā)現(xiàn)在同一個(gè)運(yùn)行期間內(nèi)先前被插入的記錄.當(dāng)使用子選擇子句時(shí),情況能很容易混淆)MYSQL數(shù)據(jù)庫(kù)
AUTO_INCREMENT列象往常一樣工作.
如果使用INSERT ... SELECT或INSERT ... VALUES語(yǔ)句有多個(gè)值列表,可以使用C API函數(shù)mysql_info()得到查詢的信息.
信息字符串的格式如下:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates指出不能被插入的行的數(shù)量,因?yàn)樗麄兣c現(xiàn)有的唯一的索引值重復(fù).Warnings指出在出現(xiàn)某些問題時(shí)嘗試插入列值的次數(shù).在下列任何條件下都可能發(fā)生錯(cuò)誤:MYSQL數(shù)據(jù)庫(kù)
插入NULL到被聲明了NOT NULL的列,列被設(shè)置為它的缺省值.
將超出列范圍的值設(shè)置給一個(gè)數(shù)字列,值被剪切為范圍內(nèi)適當(dāng)?shù)亩它c(diǎn)值.
將數(shù)字列設(shè)成例如'10.34 a'的值,拖尾的垃圾被剝?nèi)ゲ⑷匀皇菙?shù)字部分被插入.如果值根本不是一個(gè)數(shù)字,列被設(shè)置到0.
把一個(gè)字符串插入到超過列的最大長(zhǎng)度的一個(gè)CHAR、VARCHAR、TEXT或BLOB列中.值被截?cái)酁榱械淖畲箝L(zhǎng)度.
把一個(gè)對(duì)列類型不合法的值插入到一個(gè)日期或時(shí)間列.列被設(shè)置為該列類型適當(dāng)?shù)摹傲恪敝?
對(duì)于INSERT語(yǔ)句的DELAYED選項(xiàng)是MySQL專屬的選項(xiàng)-如果客戶有不能等到INSERT完成,它是很有用的.當(dāng)為日記登錄使用MySQL時(shí),而且也周期性地運(yùn)行花很長(zhǎng)時(shí)間完成的SELECT語(yǔ)句,這是一個(gè)常見的問題.DELAYED在面MySQL 3.22.15中被引入,它是MySQL對(duì) ANSI SQL92 的一個(gè)擴(kuò)展.MYSQL數(shù)據(jù)庫(kù)
當(dāng)使用INSERT DELAYED時(shí),客戶將馬上準(zhǔn)備好,并且當(dāng)表不被任何其他的線程使用時(shí),行將被插入.MYSQL數(shù)據(jù)庫(kù)
另一個(gè)使用INSERT DELAYED的主要好處是從很多客戶插入被捆綁在一起并且寫進(jìn)一個(gè)塊.這比做很多單獨(dú)的插入要來的快.MYSQL數(shù)據(jù)庫(kù)
注意,當(dāng)前排隊(duì)的行只是存儲(chǔ)在內(nèi)存中,直到他們被插入到表中.這意味著,如果硬要?dú)⑺續(xù)ysqld(kill -9)或如果mysqld出人意料地死掉,沒被寫進(jìn)磁盤的任何排隊(duì)的行被丟失!MYSQL數(shù)據(jù)庫(kù)
下列詳細(xì)描述當(dāng)為INSERT或REPLACE使用DELAYED選項(xiàng)時(shí),發(fā)生什么.在這個(gè)描述中,“線程”是收到一個(gè)INSERT DELAYED命令的線程并且“處理器”是處理所有對(duì)于一個(gè)特定表的INSERT DELAYED語(yǔ)句.MYSQL數(shù)據(jù)庫(kù)
當(dāng)一個(gè)線程對(duì)一個(gè)表執(zhí)行一個(gè)DELAYED語(yǔ)句時(shí),如果不存在這樣的處理程序,一個(gè)處理器線程被創(chuàng)建以處理對(duì)于該表的所有DELAYED語(yǔ)句.
線程檢查處理程序是否已經(jīng)獲得了一個(gè)DELAYED鎖;如果沒有,它告訴處理程序去獲得.即使其他的線程有在表上的一個(gè)READ或WRITE鎖,也能獲得DELAYED鎖.然而,處理程序?qū)⒌却蠥LTER TABLE鎖或FLUSH TABLES以保證表結(jié)構(gòu)是最新的.MYSQL數(shù)據(jù)庫(kù)
線程執(zhí)行INSERT語(yǔ)句,但不是將行寫入表,它把最后一行的副本放進(jìn)被處理器線程管理的一個(gè)隊(duì)列.任何語(yǔ)法錯(cuò)誤都能被線程發(fā)覺并報(bào)告給客戶程序.
顧客不能報(bào)告結(jié)果行的重復(fù)次數(shù)或AUTO_INCREMENT值;它不能從服務(wù)器獲得它們,因?yàn)镮NSERT在插入操作完成前返回.如果使用C API,同樣原因,mysql_info()函數(shù)不返回任何有意義的東西.MYSQL數(shù)據(jù)庫(kù)
當(dāng)行被插入到表中時(shí),更新日志有處理器線程更新.在多行插入的情況下,當(dāng)?shù)谝恍斜徊迦霑r(shí),更新日志被更新.
在每寫入delayed_insert_limit行后,處理器檢查是否任何SELECT語(yǔ)句仍然是未完成,如果這樣,在繼續(xù)之前允許執(zhí)行這些語(yǔ)句.MYSQL數(shù)據(jù)庫(kù)
當(dāng)處理器在它的隊(duì)列中沒有更多行時(shí),表被解鎖.如果在delayed_insert_timeout秒內(nèi)沒有收到新的INSERT DELAYED命令,處理器終止.
如果已經(jīng)有多于delayed_queue_size行在一個(gè)特定的處理器隊(duì)列中未辦理,線程等待直到隊(duì)列有空間.這有助于保證mysqld服務(wù)器對(duì)延遲的內(nèi)存隊(duì)列不使用所有內(nèi)存.MYSQL數(shù)據(jù)庫(kù)
處理器線程將在Command列的MySQL進(jìn)程表中顯示delayed_insert.如果執(zhí)行一個(gè)FLUSH TABLES命令或以KILL thread_id殺死它,它將被殺死,然而,它在退出前首先將所有排隊(duì)的行存進(jìn)表中.在這期間,這次它將不從其他線程接受任何新的INSERT命令.如果在它之后執(zhí)行一個(gè)INSERT DELAYED,將創(chuàng)建一個(gè)新的處理器線程.MYSQL數(shù)據(jù)庫(kù)
注意,如果有一個(gè)INSERT DELAYED處理器已經(jīng)運(yùn)行,INSERT DELAYED命令有比正常INSERT更高的優(yōu)先級(jí)!其他更新命令將必須等到INSERT DELAY排隊(duì)變空、殺死處理器線程(用KILL thread_id)或執(zhí)行FLUSH TABLES.MYSQL數(shù)據(jù)庫(kù)
以下的狀態(tài)變量提供了關(guān)于INSERT DELAYED命令的信息: Delayed_insert_threads 處理器線程數(shù)量
Delayed_writes 用INSERT DELAYED被寫入的行的數(shù)量
Not_flushed_delayed_rows 等待被寫入的行數(shù)字MYSQL數(shù)據(jù)庫(kù)
能通過發(fā)出一個(gè)SHOW STATUS語(yǔ)句或通過執(zhí)行一個(gè)mysqladmin extended-status命令察看這些變量.MYSQL數(shù)據(jù)庫(kù)
注意,如果表不在使用,INSERT DELAYED比一個(gè)正常的INSERT慢.
對(duì)服務(wù)器也有額外開銷來處理對(duì)它使用INSERT DELAYED的每個(gè)表的一個(gè)單獨(dú)線程.
也就是說,應(yīng)該只在確實(shí)肯定需要它的時(shí)候才使用INSERT DELAYED!MYSQL數(shù)據(jù)庫(kù)
以上就是MYSQL INSERT INTO語(yǔ)句用法的全部?jī)?nèi)容,希望對(duì)大家有所贊助.MYSQL數(shù)據(jù)庫(kù)
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Mysql學(xué)習(xí)Mysql INSERT INTO語(yǔ)句用法詳解》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/13705.html