Mariadb
如何編寫諸如“更新重複鍵更新到其他內容”之類的程式碼?
作為在小型數據庫中處理英國 GDPA“被遺忘權”的一部分,我想將表“成員”中一行的 (autoinc) PK 更新為混淆值,並讓它通過相關表中的 FK 向下級聯,例如他們擔任某些職位的日期。
如果我隨後將表“成員”中的成員名稱設置為空字元串,我仍然可以使用我的相關表,例如確定有人在某個時間擔任某個職位,但我將無法再確定持有人的姓名或身份證,這就是我想要的。
我編寫了一個簡單的 UDF obfuscate_id(),它採用正整數 ID 並返回通過將傳遞的 id 與隨機數組合計算得出的負 ID。
FUNCTION obfuscate_id(id INT) RETURNS INT COMMENT 'returns the negative version of the id passed, obfuscated by a random number' BEGIN DECLARE result INT; SET result = (FLOOR(RAND(id)*10000) + id ) * -1; IF result > 0 THEN -- ensures result is -ve even if called with a -ve parameter SET result = result * -1; END IF; RETURN result; END;
我正在使用 sql
UPDATE member SET member_id = obfuscate_id(member_id) WHERE member_id = 1234;
但是,這可能會從另一個 member_id 的先前更新中生成已經存在的負 id。如果是這樣,我想將其設置為其他內容,也許可以通過再次混淆 id,如
SET member_id = obfuscate_id(obfuscate_id(member_id));
有沒有一種簡單的方法,比如 ON DUPLICATE KEY … 檢查我要更新的值是否已經存在,如果是,則更新為其他值?
我確實看過 how-to-use-on-duplicate-key-for-update 和 update-on-duplicate-key-update 和 mysql-update-with-on-duplicate-key-update 但我並不明智
我要補充一點,考慮到表“成員”的大小和特定的應用程序,即使是第一次更新也將是非常罕見的,所以有任何混淆 ID 的可能性非常小,更不用說重複的了,但我如果可以的話,我想涵蓋可能發生的情況。
member
只選擇一個範圍在表中目前值範圍之外的隨機數不是更簡單/更容易嗎?例如(FLOOR(RAND(id)) * -1) + (SELECT MIN(id) FROM member)
(半虛擬碼)之類的東西?