作为在小型数据库中处理英国 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)
(半伪代码)之类的东西?