Database 如何替换整个数据库中的字符串(数据值)?

Database 如何替换整个数据库中的字符串(数据值)?,database,postgresql,replace,dynamic-sql,Database,Postgresql,Replace,Dynamic Sql,我想替换所有表中的子字符串,比如我想在postgres中将“Center”替换为“Center”。那么有没有办法做到这一点?我在特定列中找到了一个替换子字符串的问题 F.Y.I.:我用的是“pgAdmin III”。 我无法通过解决类似的问题来解决我的问题。我不知道任何表和列名。因此,我希望替换整个数据库和所有列中的值。使用此select查询获取所有表及其列(由于要更新文本字段,数据类型为text或character的列会发生变化) 根据您的条件,将其包装在动态SQL中进行更新 DO $$ DE

我想替换所有表中的子字符串,比如我想在postgres中将“Center”替换为“Center”。那么有没有办法做到这一点?我在特定列中找到了一个替换子字符串的问题

F.Y.I.:我用的是“pgAdmin III”。
我无法通过解决类似的问题来解决我的问题。我不知道任何表和列名。因此,我希望替换整个数据库和所有列中的值。

使用此select查询获取所有表及其列(由于要更新文本字段,数据类型为text或character的列会发生变化)

根据您的条件,将其包装在动态SQL中进行更新

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE '||C.table_name||'  SET '||C.column_name||' = REPLACE ('||C.COLUMN_NAME||',''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

使用此select查询获取所有表及其列(由于要更新文本字段,数据类型为text或character的列会发生变化)

根据您的条件,将其包装在动态SQL中进行更新

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE '||C.table_name||'  SET '||C.column_name||' = REPLACE ('||C.COLUMN_NAME||',''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

使用此select查询获取所有表及其列(由于要更新文本字段,数据类型为text或character的列会发生变化)

根据您的条件,将其包装在动态SQL中进行更新

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE '||C.table_name||'  SET '||C.column_name||' = REPLACE ('||C.COLUMN_NAME||',''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

使用此select查询获取所有表及其列(由于要更新文本字段,数据类型为text或character的列会发生变化)

根据您的条件,将其包装在动态SQL中进行更新

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE '||C.table_name||'  SET '||C.column_name||' = REPLACE ('||C.COLUMN_NAME||',''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;

Wingedparter代码的一点修改:

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE "'||C.table_name||'"  SET "'||C.column_name||'" = REPLACE ("'||C.COLUMN_NAME||'",''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;
我添加了一些双引号,使其在表名包含下划线符号时仍然有效。
在第9.5.11-0ubuntu0.16.04页上可以完美地工作。

对Wingedparter的代码进行一些修改:

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE "'||C.table_name||'"  SET "'||C.column_name||'" = REPLACE ("'||C.COLUMN_NAME||'",''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;
我添加了一些双引号,使其在表名包含下划线符号时仍然有效。
在第9.5.11-0ubuntu0.16.04页上可以完美地工作。

对Wingedparter的代码进行一些修改:

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE "'||C.table_name||'"  SET "'||C.column_name||'" = REPLACE ("'||C.COLUMN_NAME||'",''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;
我添加了一些双引号,使其在表名包含下划线符号时仍然有效。
在第9.5.11-0ubuntu0.16.04页上可以完美地工作。

对Wingedparter的代码进行一些修改:

DO
$$
DECLARE 
rw record;
BEGIN
FOR rw IN 
    SELECT 'UPDATE "'||C.table_name||'"  SET "'||C.column_name||'" = REPLACE ("'||C.COLUMN_NAME||'",''Center'',''Centre''); ' QRY
    FROM (SELECT column_name,table_name 
          FROM   information_schema.columns 
          WHERE  table_schema='public' 
          AND    (data_type ='text' OR data_type ='character varying')
          AND    table_name in (SELECT table_name 
                                FROM   information_schema.tables 
                                WHERE  table_schema='public' 
                                AND    table_type ='BASE TABLE'))c

LOOP
    EXECUTE rw.QRY;
END LOOP;
END;
$$;
我添加了一些双引号,使其在表名包含下划线符号时仍然有效。

在第9.5.11-0ubuntu0.16.04页上运行良好。

正如您链接到的问题中所回答的:
更新表集字段=替换(字段'cat',dog')
。根据需要对每个表(和字段)执行此操作。对于整体更改,您还可以转储数据,在.sql文件中查找/替换,然后重新导入。我尝试过这样做,但无法在整个数据库中替换。这是因为您不能。一次只能修改一个表,因此需要遍历所有表的列表,并使用每个表的所有适用列运行查询。或者,如果您确定要批量完成此操作,请转储数据、查找/替换、重新导入。我不知道所有具有该数据值的表和列名,因此在给定的方法中不可能这样做。如果您能说明更多内容或从问题中删除重复标志,我们将不胜感激。@PuneetPurohit您知道哪些表可以执行此任务吗?以及哪些列??正如您链接到的问题中所回答的:
updatetable set field=replace(field'cat',dog')
。根据需要对每个表(和字段)执行此操作。对于整体更改,您还可以转储数据,在.sql文件中查找/替换,然后重新导入。我尝试过这样做,但无法在整个数据库中替换。这是因为您不能。一次只能修改一个表,因此需要遍历所有表的列表,并使用每个表的所有适用列运行查询。或者,如果您确定要批量完成此操作,请转储数据、查找/替换、重新导入。我不知道所有具有该数据值的表和列名,因此在给定的方法中不可能这样做。如果您能说明更多内容或从问题中删除重复标志,我们将不胜感激。@PuneetPurohit您知道哪些表可以执行此任务吗?以及哪些列??正如您链接到的问题中所回答的:
updatetable set field=replace(field'cat',dog')
。根据需要对每个表(和字段)执行此操作。对于整体更改,您还可以转储数据,在.sql文件中查找/替换,然后重新导入。我尝试过这样做,但无法在整个数据库中替换。这是因为您不能。一次只能修改一个表,因此需要遍历所有表的列表,并使用每个表的所有适用列运行查询。或者,如果您确定要批量完成此操作,请转储数据、查找/替换、重新导入。我不知道所有具有该数据值的表和列名,因此在给定的方法中不可能这样做。如果您能说明更多内容或从问题中删除重复标志,我们将不胜感激。@PuneetPurohit您知道哪些表可以执行此任务吗?以及哪些列??正如您链接到的问题中所回答的:
updatetable set field=replace(field'cat',dog')
。根据需要对每个表(和字段)执行此操作。对于整体更改,您还可以转储数据,在.sql文件中查找/替换,然后重新导入。我尝试过这样做,但无法在整个数据库中替换。这是因为您不能。一次只能修改一个表,因此需要遍历所有表的列表,并使用每个表的所有适用列运行查询。或者,如果您确定要批量完成此操作,请转储数据、查找/替换、重新导入。我不知道所有具有该数据值的表和列名,因此在给定的方法中不可能这样做。如果您能说明更多内容或从问题中删除重复标志,我们将不胜感激。@PuneetPurohit您知道哪些表可以执行此任务吗?以及哪些列??错误:“用户”第1行或其附近的语法错误:更新用户集firstname=REPLACE(firstname,'Center','Ce…^查询:更新用户集firstname=REPLACE(firstname,'Center','Center');上下文:PL/pgSQL函数内联\u code\u bl