欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

UPDATE和REPLACE的區(qū)別與用法

阮建安2年前40瀏覽0評論
UPDATE和REPLACE的區(qū)別與用法?

在涉及到DataBase的開發(fā)的過程,經(jīng)常遇到如下的場景:

業(yè)務(wù)邏輯需要向數(shù)據(jù)庫插入一條新數(shù)據(jù),但是需要做如下的判斷:

1. 判斷數(shù)據(jù)庫里是否已經(jīng)存在這樣一條記錄(有特定的判斷依據(jù));

2.1 如果數(shù)據(jù)庫里沒有這條記錄,那么全新創(chuàng)建這條記錄;

2.2 如果數(shù)據(jù)庫里已有這條記錄,那么更新這條記錄;

一般情況下,會想到的處理方式如下:

編程代碼級控制數(shù)據(jù)的插入和更新:

synchronized void insertNewRecord(Object data){

Object data = “select * from table where clientId = ‘a(chǎn)bc’”;

if(data == null) {

// INSERT into table;

} else {

// update table;

}

}

這時候考慮到線程安全的問題,給整個方法加上了synchronized關(guān)鍵字,從而保證整個方法的多個步驟形成一個原子操作。 這時候所帶的問題也顯而易見:

1. 需要通過細心的編程來保證這個操作在多線程下的正確性;

2. 通過synchronize關(guān)鍵字對整個方法進行同步,對系統(tǒng)性能無疑會產(chǎn)生影響;

3. 能數(shù)據(jù)的操作是通過兩次操作的完成的。

那么有沒什么方法可以解決上面的問題,將對數(shù)據(jù)庫的兩次操作變成一次呢?

在MySql里可以通過以下兩種SQL語句來完成:

1. INSERT ON DUPLICATE KEY UPDATE

如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后會導(dǎo)致在一個UNIQUE索引或PRIMARY KEY中出現(xiàn)重復(fù)值,則執(zhí)行舊行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語句相當(dāng):

mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

如果a=1 OR b=2與多個行向匹配,則只有一個行被更新。通常,您應(yīng)該盡量避免對帶有多個唯一關(guān)鍵字的表使用ON DUPLICATE KEY子句。

2. REPLACE INTO VALUES

使用REPLACE的最大好處就是可以將DELETE和INSERT合二為一,形成一個原子操作。這樣就可以不必考慮在同時使用DELETE和INSERT時添加事務(wù)等復(fù)雜操作了。

在使用REPLACE時,表中必須有唯一索引,而且這個索引所在的字段不能允許空值,否則REPLACE就和INSERT完全一樣的。

在執(zhí)行REPLACE后,系統(tǒng)返回了所影響的行數(shù),如果返回1,說明在表中并沒有重復(fù)的記錄,如果返回2,說明有一條重復(fù)記錄,系統(tǒng)自動先調(diào)用了DELETE刪除這條記錄,然后再記錄用INSERT來插入這條記錄。如果返回的值大于2,那說明有多個唯一索引,有多條記錄被刪除和插入。

REPLACE的語法和INSERT非常的相似,如下面的REPLACE語句是插入或更新一條記錄。

REPLACE INTO users (id,name,age) VALUES(123, '趙本山', 50);

注: REPLACE和INSERT ON DUPLICATE的區(qū)別,在于REPLACE會影響多條結(jié)果。比如在表中有超過一個的唯一索引。在這種情況下,REPLACE將考慮每一個唯一索引,并對每一個索引對應(yīng)的重復(fù)記錄都刪除,然后插入這條新記錄。假設(shè)有一個table1表,有3個字段a, b, c。它們都有一個唯一索引。

CREATE TABLE table1(a INT NOT NULL UNIQUE,b INT NOT NULL UNIQUE,c INT NOT NULL UNIQUE);

假設(shè)table1中已經(jīng)有了3條記錄

a b c

1 1 1

2 2 2

3 3 3

下面我們使用REPLACE語句向table1中插入一條記錄。

REPLACE INTO table1(a, b, c) VALUES(1,2,3);

返回的結(jié)果如下

Query OK, 4 rows affected (0.00 sec)

在table1中的記錄如下

a b c

1 2 3

我們可以看到,REPLACE將原先的3條記錄都刪除了,然后將(1, 2, 3)插入。

最后: 上述兩種方法都作用在唯一性索引上,如果你判斷重復(fù)的列不是唯一性索引,那么這兩種方法必然是不適用的,那么這時候還想作為一次操作就必須作用SQL的組合語句了:

INSERT INTO table VALUES (*, * , *, …) WHERE * NOT IN (SELECT * FROM WHERE *=*);

好文要頂 關(guān)注我 收藏該文