数据库如何批量替换任意字段的某字符串 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
iblessyou

数据库如何批量替换任意字段的某字符串

  •  
  •   iblessyou 2021 年 1 月 28 日 2142 次点击
    这是一个创建于 1912 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看标题也不难猜了,我这是因为要做数据脱敏,数据库使用的 postgres

    以前给组织 A 做过的项目,现在几十个表,要求将所有表所有字段里出现的“组织 A”都替换成 XXX 。 尝试用了 Navicat 的模式查询,可以查到,但是改着不方便。 这个有简单点的办法吗

    10 条回复    2021-01-28 18:25:02 +08:00
    Te11UA
        1
    Te11UA  
       2021 年 1 月 28 日   1
    `UPDATE table SET 组织名字 = replace(组织名字, '组织 A', 'XXXX')`
    这个?
    Duolingo
        2
    Duolingo  
       2021 年 1 月 28 日 via Android
    把表导出成 excel 或 sql
    然后全局搜索替换
    然后重新导入
    kaiki
        3
    kaiki  
       2021 年 1 月 28 日
    也可以直接把查询到的需要修改的部分导出,用外部程序批量正则修改再进行更新
    levelworm
        4
    levelworm  
       2021 年 1 月 28 日
    应该可以查询到每张表每列的名字吧,然后做个小程序更新一下?
    找了一下 Stackoverflow 有人做了个 Perl 的程序:
    https://stackoverflow.com/questions/29211779/how-can-i-change-all-occurrences-of-a-particular-value-in-any-column-in-postgres
    id4alex
        5
    id4alex  
       2021 年 1 月 28 日
    你需要用元数据的列记录 去拼接 SQL concat('REPLACE(',column_name','\'组织 A\',\'XXXX\') as ',column_name)
    类似的操作去生成那个 SELECT 语句.

    select * from INFORMATION_SCHEMA.columns

    你可以先看看这个 INFORMATION_SCHEMA 元数据库
    iblessyou
        6
    iblessyou  
    OP
       2021 年 1 月 28 日
    @Te11UA 字段不固定,可能是组织名字段,也可能地址、设备名什么乱七八糟里面会包含
    iblessyou
        7
    iblessyou  
    OP
       2021 年 1 月 28 日
    @codingadog 不行的,数据量比较大
    iblessyou
        8
    iblessyou  
    OP
       2021 年 1 月 28 日
    @levelworm
    @id4alex
    谢谢,目前看到这个是较可行的解决思路了:
    先获取所有字符串类型的字段和所在表,再批量生成更新语句。
    id4alex
        9
    id4alex  
       2021 年 1 月 28 日
    @iblessyou 可以通过 SQL 去生成 SQL 再执行生成的 SQL 。


    这种脱敏的需求可以做到自动化的。
    heysnakelis
        10
    heysnakelis  
       2021 年 1 月 28 日
    SELECT
    TABLE_NAME,
    COLUMN_TYPE,
    COLUMN_NAME,
    CONCAT(
    'select `',COLUMN_NAME,'` as data ,"',COLUMN_NAME,'" as column_name ,"',TABLE_NAME,'" as table_name from ',
    TABLE_NAME,
    ' where `',
    COLUMN_NAME,
    '` like "%关键字%" or `',COLUMN_NAME,'` like "%关键字%" ' , "UNION "
    )
    FROM
    information_schema.`COLUMNS`
    WHERE
    TABLE_SCHEMA = 'test'


    参考下,select 改成 update
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2998 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 79ms UTC 02:45 PVG 10:45 LAX 19:45 JFK 22:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86