雖然號稱對Sqlite的使用有一年多的經驗,但實際上並沒有對Sqlite的各種文法有深入的瞭解,畢竟大多數時候選擇Sqlite這種微型資料庫,表結構設計上都十分的簡單,一些複雜的sql操作很少會用到。另一方面Sqlite居然理論上可以支援2TB的資料,相信隨著各路神仙對Sqlite的推崇,日後還是會大有作為的。
今天著重想談一談Sqlite中的Update。
1.典型的Update(支援)
Update
T1
Set
Column1 = v1,
Column2 =V2
Where
key = V3;
2.Update…From(很不幸,Sqlite是不支援的)
UPDATE
t1
SET
Column1= t2. Column1
FROM
t2, t1
WHERE
t2.key = t1.key;
要進行表間更新Update…From是必須的,居然Sqlite不支援,有什麼別的辦法嗎?還確實有,替代方法有兩種:
首先,Sqlite裡面有一個新鮮玩意“INSERT OR REPLACE”,跟Mysql類似,這個結構能夠保證在存在的情況下替換,不存在的情況下更新,用這個機制就可以輕鬆實現Update…From 了。
INSERT OR REPLACE INTO
t1( key, Column1, Column2)
SELECT
t2.key, t2. Column1,t2. Column2
FROM
t2, t1
WHERE
t2.key = t1.key;
備忘:這種方法要避免插入操作,首先要確保是依照主鍵執行的更新,如果where條件不是主鍵可能就有點麻煩了。
要是不是主鍵的更新怎麼辦能?另外還有其他的辦法嗎?我們在這中情況下只能向典型的Update…where尋求協助了,下面是一個例子:
UPDATE
t1
SET
Column1 = ( SELECT Columnx FROM t2 WHERE t2.key =t1.key ),
Column2 = ( SELECT Columny FROM t2 WHERE t2.key =t1.key ),
WHERE t1.key = ( SELECT key FROM t2 WHERE t2.key=t1.key);
下面舉一個主從表的例子,一個部門表,一個成員表,成員表中的部門名稱和代碼是冗餘的資訊,以部門表中的部門名稱和代碼更新成員表中的冗餘資訊:
update
userlogins
set
deptname = (select deptname from DepartMents where DepartMents.[DeptID] = userlogins.[DeptID]),
deptcode = (select deptcode from DepartMents where DepartMents.[DeptID] = userlogins.[DeptID])
where
userlogins.[DeptID] = ( SELECT [DeptID] FROM DepartMents where DepartMents.[DeptID] = userlogins.[DeptID]);