2014-12-01 4 views
0

Я хочу заменить подстроку со всех таблиц, я хочу заменить «Центр» на «Центр» в postgres. Так есть ли способ сделать это? Я нашел вопрос similar, чтобы заменить подстроку в определенном столбце.Как заменить строку (значение данных) во всей базе данных?

F.Y.I. : Я использую «pgAdmin III». Я не могу решить свою проблему через решение аналогичного вопроса. Я не знаю ни таблицы, ни любого имени столбца. Поэтому я хочу заменить значение во всей базе данных и во всех столбцах.

+0

Как ответил в самом вопросе, который вы связали с: 'update table set field = replace (поле, 'cat', 'dog')'. Сделайте это для каждой таблицы (и поля), если это необходимо. Для оптового изменения вы также можете сбросить данные, найти/заменить в файле .sql и повторно импортировать. –

+0

Я пытался сделать это, но не смог заменить всю базу данных. –

+0

Это потому, что вы не можете. Вы можете изменять только одну таблицу за раз, поэтому нужно перебирать список всех таблиц и запускать запрос со всеми применимыми столбцами для каждой таблицы. Или, если вы уверены, что хотите сделать это оптом, выгрузите данные, найдите/замените, повторно импортируйте. –

ответ

1

Используйте этот запрос на выборку, чтобы получить все таблицы и ее столбцы (столбцы с типом данных текста или характер изменения, так как вы хотите обновить текстовое поле)

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') 

Wrap это в динамическом 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; 
$$; 
+0

ERROR: ошибка синтаксиса у пользователя или рядом с ним« LINE 1: UPDATE user SET firstname = REPLACE (первое имя, «Центр», «Се ... ^ QUERY: UPDATE user SET firstname = REPLACE (первое имя,« Центр »,« Центр »); КОНТЕКСТ: функция PL/pgSQL inline_code_block строка 17 в заявлении EXECUTE ********** Ошибка ********** ОШИБКА: ошибка синтаксиса у пользователя или рядом с ним « Состояние SQL: 42601 Контекст: PL/pgSQL функция inline_code_block строка 17 на EXECUTE statement –

+0

Я получаю это сообщение об ошибке :( –

+0

@PuneetPurohit просто запускает 'SELECT' в за цикл и комментарий, что вы получаете –

0

немного модификация кода wingedpanther в:

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; 
$$; 

Я добавил несколько двойных кавычек, чтобы они все еще работали, когда имя таблицы содержит символ подчеркивания. Отлично работает на PG 9.5.11-0ubuntu0.16.04.

Смежные вопросы