問題:我有兩個表(members1和members2),它們只是用戶名的串列。我需要改變members1中的一個用戶名,但前提是新的用戶名不能出現在兩個表中(換句話說,用戶名在兩個表中必須是唯一的)。
SQL 不在我的舒適區,但經過幾個小時的谷歌搜索,我想到了下面這個查詢。實際上,我使用的是 SQLite 的 C API,所以這只是一個測驗 shell 腳本,用于檢查語法。該腳本將一個舊名稱改為新名稱,其中$1是舊名稱,而$2是新名稱:
#!/usr/bin/env bash
sqlite3 test.db <<EOF
update members1 set uname=
case
exists(select 1 from members1 where uname='2') or
exists(select 1from members2 where uname='2')
when 1 then '1'
else '2'/span>
end
where uname='1';
EOF
問題:
- 這似乎是可行的,但它有意義嗎?它似乎很啰嗦。是否有更好的方法來做到這一點?特別是,如果存在名稱沖突,是否真的有必要更新
members1以將舊名稱改回自己? - 如果多個行程同時做同樣的事情,這樣做的安全性如何?行程A是否有可能將'john'改為'jim',而行程B同時將'jo'改為'jim',從而使'jim'在資料庫中出現兩次?
- 實際上大寫/小寫的協議是什么?上面的代碼運行沒有問題,但是網路上的所有東西都是大寫字母。
謝謝。
uj5u.com熱心網友回復:
如果我是你。我做了一個獨特的'umembers'表。
我用觸發器填充它。
我用觸發器填充它。(members1和members2也是)你可以想出更新觸發器。
CREATE TRIGGER IF NOT EXISTS members1trigger
BEFORE INSERT ON members1
BEGIN
INSERT INTO umembers VALUES(new.uname,其他屬性)。
END。
那么你的更新就是這樣了
#! /usr/bin/env bash
sqlite3 test.db <</span>EOF
update members1 set uname=$ 2
where uname='$1'/span> and not exists (select 1 from umembers where uname= $2)。)
EOF
當然,你應該在umembers上創建唯一約束。 如果有paralell更新,那么第二個也許可以拋出例外。 但是我認為索引鎖定了它,所以不可能發生。
安全問題說要使用不區分大小寫的登錄方式。
https://security.stackexchange.com/questions/241701/case-sensitive-logins
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/327130.html
標籤:
