如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值

Posted

技术标签:

【中文标题】如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值【英文标题】:How to find a particular column in all tables and modify the values of that column in PostgreSQL 【发布时间】:2019-07-11 14:21:51 【问题描述】:

我是 PostgreSQL 新手。实际上,我想将所有表格中的所有电子邮件地址更改为一些虚假的电子邮件地址。比如我希望 abc@gmail.com 应该变成 abc@1234gmail.com,xyz@hotmail.com 应该变成 xyz@1234hotmail.com 等等。

我找到了提供包含电子邮件列的表的查询。这是查询

select t.table_schema, t.table_name
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name and c.table_schema = t.table_schema
where c.column_like '%email%'
and t.table_schema not in ('information_schema', 'pg_catalog')
and t.table_type = 'BASE TABLE'
order by t.table_schema;

它给了我一些记录。现在一种方法是转到每个表并更改电子邮件列的值。但是我可以修改上述查询以获取每封电子邮件的值并将其更改为某个假地址吗?就像电子邮件值是 abc@gmail.com 一样,只需在每个电子邮件地址的 @ 符号后附加 12345 或任何值。所以每个 email 值变成 abc@1234gmail.com, xyz@1234hotmail.com 等等

【问题讨论】:

【参考方案1】:

您可以为每一列构建一组更新查询,如下所示 -

    select concat('update ', t.table_schema, '.', t.table_name, ' set ', c.column_name, ' = replace(', c.column_name, ', ''@'', ''@1234'') ') 
from information_schema.tables t
inner join information_schema.columns c on c.table_name = t.table_name and c.table_schema = t.table_schema
where c.column_name like '%email%'
and t.table_schema not in ('information_schema', 'pg_catalog')
and t.table_type = 'BASE TABLE' order by t.table_schema;

此查询将为每列构建一个更新语句,该语句使用替换函数将“@”替换为“@1234”。我还没有完全测试过它,但希望它能给你一个工作的方法。

【讨论】:

以上是关于如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值的主要内容,如果未能解决你的问题,请参考以下文章

如何从多个表中选择列并在 yii 框架中显示

PL/pgSQL 函数 - 遍历特定列并在循环中执行第二个查询

如何将distinct应用于特定列并从JPA中的表中获取所有值(Criteria Builder)

如何找到所有具有 CHAR 数据类型的列并在其中具有数值的表?

如何使用 MYSQL 中的连接从多个表中获取多个列并在非空列上显示数据以及在空列上显示 null 或零

PostgreSQL - 从连接表中选择聚合列并使用它来求和