【发布时间】:2019-01-28 10:08:31
【问题描述】:
背景和目标
我正在尝试对我的数据表中的一些产品编号进行伪匿名化。请参阅下面的示例代码。产品编号是 10 个数字,对于表格来说可能是唯一的,也可能不是唯一的。
由于我可能希望链接到其他表,因此我想使用一种非随机方式对数据进行伪匿名化。
系统是 SQLite 3.10.1。但是,任何类型的带 SQL 的 DBMS 都可以。
我的限制是:
- 保持和原来一样的长度
- 将每个数字换成另一个数字或一个字母
我已采取的措施
我实际上是要检查每一个可能的数字并按如下方式更新它。但是,这感觉是一种非常低效的方法。
UPDATE test
SET pseudo_num = replace(pseudo_num, '0', 'B');
UPDATE test
SET pseudo_num = replace(pseudo_num, '1', 'T');
UPDATE test
SET pseudo_num = replace(pseudo_num, '2', 'A');
UPDATE test
SET pseudo_num = replace(pseudo_num, '3', 'A');
UPDATE test
SET pseudo_num = replace(pseudo_num, '4', 'D');
UPDATE test
SET pseudo_num = replace(pseudo_num, '5', '3');
UPDATE test
SET pseudo_num = replace(pseudo_num, '6', '2');
UPDATE test
SET pseudo_num = replace(pseudo_num, '7', '4');
UPDATE test
SET pseudo_num = replace(pseudo_num, '8', 'X');
UPDATE test
SET pseudo_num = replace(pseudo_num, '9', 'L');
问题
- 是否有更快的方法来做到这一点,例如通过批量更换?
- 是否有另一种标准方法来进行伪匿名化,我可以利用它来保持在我上面概述的限制范围内?
创建数据表的示例代码
CREATE TABLE test (
prod_num varchar(14),
owner varchar(255) default NULL,
prod_date varchar(255)
);
INSERT INTO test (prod_num,owner,prod_date) VALUES ("260619275","Kieran","Feb 10, 2018"),("316556232","Steven","Jan 6, 2020"),("625302534","Oliver","Feb 10, 2018"),("811424845","Jeremy","Apr 12, 2018"),("060961216","Quinlan","Jul 19, 2019"),("713794360","Stuart","Nov 1, 2019"),("553381666","George","Jan 8, 2019"),("978519361","Macon","Nov 26, 2018"),("352718969","Raphael","Jul 21, 2019"),("803299478","Byron","Nov 26, 2019");
INSERT INTO test (prod_num,owner,prod_date) VALUES ("696124452","Dalton","Jul 17, 2018"),("892088485","Keane","Jul 9, 2018"),("817054190","Dillon","Apr 23, 2018"),("500170097","Fitzgerald","Feb 11, 2019"),("663252252","Thomas","Apr 10, 2018"),("061983557","Alan","May 12, 2018"),("492057435","Jarrod","Apr 16, 2018"),("837802495","Shad","Mar 22, 2019"),("725698187","Mark","Jul 22, 2018"),("153352349","Akeem","Feb 19, 2018");
ALTER TABLE test
ADD pseudo_num NVARCHAR(20);
UPDATE test
SET pseudo_num = prod_num;
【问题讨论】:
-
替换有什么整体逻辑吗?您使用的是什么版本的 SQL?
-
我不确定用已知数字(或字母)替换数字是否是一个好的匿名化,因为它是可逆的(除了 A,它是 2 或 3)
-
当然是可逆的,但我认为没关系 - 它应该是伪匿名的,而不是完全的
-
如果您使用的是 SQLite,那么您需要 SQLite 中的解决方案。
标签: sql performance sqlite