mysql 有用的特殊語法

2021-09-02 13:43:09 字數 3272 閱讀 8577

insert語法

insert [low_priority | delayed | high_priority] [ignore]

[into] tbl_name [(col_name,...)]

values (,...),(...),...

[ on duplicate key update col_name=expr, ... ]

或:insert [low_priority | delayed | high_priority] [ignore]

[into] tbl_name

set col_name=, ...

[ on duplicate key update col_name=expr, ... ]

或:insert [low_priority | high_priority] [ignore]

[into] tbl_name [(col_name,...)]

select ...

[ on duplicate key update col_name=expr, ... ] 

一、delayed

使用延遲插入操作

delayed調節符應用於insert和replace語句。當delayed插入操作到達的時候,

伺服器把資料行放入乙個佇列中, 並立即給客戶端返回乙個狀態資訊,這樣客戶

端就可以在資料表被真正地插入記錄之前繼續進行操作了。 如果讀取者從該資料

表中讀取資料,佇列中的資料就會被保持著,直到沒有讀取者為止。接著伺服器

開始插入延遲 資料行(delayed-row)佇列中的資料行。在插入操作的同時,伺服器

還要檢查是否有新的讀取請求到達和等待。 如果有,延遲資料行佇列就被掛起,

允許讀取者繼續操作。當沒有讀取者的時候,伺服器再次開始插入延遲的資料行。

這個過程一直進行,直到佇列空了為止。

注意事項:· insert delayed

應該僅用於指定值清單的insert語句。伺服器忽略用於insert delayed...select語句的delayed。·

伺服器忽略用於insert delayed...on duplicate update語句的delayed。·

因為在行被插入前,語句立刻返回,所以您不能使用last_insert_id()來獲取auto_increment值。auto_increment值可能由語句生成。·

對於select語句,delayed行不可見,直到這些行確實被插入了為止。· delayed

在從屬復**務器中被忽略了,因為delayed不會在從屬伺服器中產生與主伺服器不一樣的資料。

注意,目前在佇列中的各行只儲存在儲存器中,直到它們被插入到表中為止。這意味著,如果您強行中止了mysqld(例如,使用kill -9)

或者如果mysqld意外停止,則所有沒有被寫入磁碟的行都會丟失。

二、ignore

ignore是mysql相對於標準sql的擴充套件。如果在新錶中有重複關鍵字,

或者當strict模式啟動後出現警告,則使用ignore控制alter table的執行。

如果沒有指定ignore,當重複關鍵字錯誤發生時,複製操作被放棄,返回前一步驟。

如果指定了ignore,則對於有重複關鍵字的行,只使用第一行,其它有衝突的行被刪除。

並且,對錯誤值進行修正,使之盡量接近正確值。

insert ignore into tb(...) value(...)

這樣不用校驗是否存在了,有則忽略,無則新增

三、on duplicate key update

如果您指定了on duplicate key update,並且插入行後會導致在乙個unique索引或primary key中出現重複值,則執行舊行update。例如,如果列a被定義為unique,並且包含值1,則以下兩個語句具有相同的效果:

mysql>insert into table (a,b,c) values (1,2,3)

on duplicate key update c=c+1;

mysql>update table set c=c+1 where a=1;

如果行作為新記錄被插入,則受影響行的值為1;如果原有的記錄被更新,則受影響行的值為2。

注釋:如果列b也是唯一列,則insert與此update語句相當:

mysql>update table set c=c+1 where a=1 or b=2 limit 1;

如果a=1 or b=2與多個行向匹配,則只有乙個行被更新。通常,您應該盡量避免對帶有多個唯一關鍵字的表使用on duplicate key子句。

您可以在update子句中使用values(col_name)函式從insert...update語句的insert部分引用列值。換句話說,如果沒有發生重複關鍵字衝突,則update子句中的values(col_name)可以引用被插入的col_name

的值。本函式特別適用於多行插入。values()函式只在insert...update語句中有意義,其它時候會返回null。

示例:mysql>insert into table (a,b,c) values (1,2,3),(4,5,6)on duplicate key update c=values(a)+values(b);

本語句與以下兩個語句作用相同:

mysql>insert into table (a,b,c) values (4,5,6) on duplicate key update c=9;

當您使用on duplicate key update時,delayed選項被忽略。

總結

1. delayed

做為快速插入,並不是很關心失效性,提高插入效能。

2. ignore  只關注主鍵對應記錄是不存在,無則新增,有則忽略。

3. on duplicate key update 在新增時操作,關注非主鍵列,注意與ignore的區別,有則更新指定列,無則新增。

mysql中幾個有用的陌生語法

一.coalesce 函式 coalesce函式表示可以返回引數中的第乙個非空表示式,當你有n個引數時選取第乙個非空值 從左到右 例項一 返回結果 carrot 例項二 返回結果 1 這些語句可以直接在mysql裡執行。一 limit offset 語法 在我們使用查詢語句的時候,經常要返回前幾條或...

sql特殊語法

複製表的結構 select into newtable from oldtable where 1 1 複製表達額內容 insert into new table select 列名 from oldtable datediff函式用法 作用 返回兩個日期之間的間隔。語法 datediff date...

mysql 特殊函式 mysql 的特殊函式

1.format 函式 函式用於對字段的顯示進行格式化 語法 select format column name,format from table name column name 必需。要格式化的字段 format 必需。規定格式。2.ucase 函式 ucase 函式把字段的值轉換為大寫。語法...