Mariadb

如何編寫諸如“更新重複鍵更新到其他內容”之類的程式碼?

  • April 2, 2021

作為在小型數據庫中處理英國 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-updateupdate-on-duplicate-key-updatemysql-update-with-on-duplicate-key-update 但我並不明智

我要補充一點,考慮到表“成員”的大小和特定的應用程序,即使是第一次更新也將是非常罕見的,所以有任何混淆 ID 的可能性非常小,更不用說重複的了,但我如果可以的話,我想涵蓋可能發生的情況。

member只選擇一個範圍在表中目前值範圍之外的隨機數不是更簡單/更容易嗎?例如(FLOOR(RAND(id)) * -1) + (SELECT MIN(id) FROM member)(半虛擬碼)之類的東西?

引用自:https://dba.stackexchange.com/questions/289067