Как обновить столбец красного смещения: простая замена текста - PullRequest
0 голосов
/ 07 июня 2018

У меня есть большая таблица target со столбцами (id, value).Я хочу обновить value='old' до value='new'.

Простейшим способом будет UPDATE target SET value='new' WHERE value='old';

Однако это удаляет и создает новые строки и не рекомендуется, возможно.Поэтому я попытался обновить столбец слияния:

# staging
CREATE TABLE stage (LIKE target INCLUDING DEFAULTS);
INSERT INTO stage (SELECT id, value FROM target WHERE value=`old`);
UPDATE stage SET value='new' WHERE value='old'; # ??? how do you update value?

# merge
begin transaction;
UPDATE target 
SET value = stage.value FROM stage
WHERE target.id = stage.id and target.distkey = stage.distkey; # collocated join?
end transaction;

DROP TABLE stage;
  1. Это не может быть лучшим способом создания табличного этапа: я должен делать все эти UPDATE удаления / записи, когда яобновить таким образом.Есть ли способ сделать это в INSERT?
  2. Необходимо ли принудительно использовать объединенное соединение, когда я использую CREATE TABLE LIKE?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

От разработчика RedShift:

В этом случае не требуется upsert или update + insert, и можно просто запустить обновление:

UPDATE target SET value='new' WHERE value='old';

Другой способбыть INSERT нужных вам строк и DELETE других строк, но это неоправданно сложно.

0 голосов
/ 07 июня 2018

Обновляете ли вы все строки в таблице?

Если да, вы можете использовать CTAS (создать таблицу как), что является рекомендуемым методом

Предполагается, что ваша таблица выглядит следующим образом

table1
id, col1,col2, value

Вы можете использовать следующий SQL для создания новой таблицы

CREATE TABLE tmp_table AS 
  SELECT id, col1,col2, 'new_value' 
  FROM table1;

После проверки данных в tmp_table

DROP TABLE table1;
ALTER TABLE tmp_table RENAME TO table1;

Если вы не обновляете все строки, вы можетеиспользуйте фильтр для создания CTAS и вставьте оставшиеся строки в новую таблицу, дайте мне знать, если вам нужно больше информации, если это так

CREATE TABLE tmp_table AS 
  SELECT id, col1,col2, 'new_value' 
  FROM table1
  WHERE value = 'old'

INSERT INTO tmp_table SELECT * from table1;

Следующим шагом будет УДАЛИТЬ таблицу tmp ипереименовать table1

Обновление: на основе вашего комментария вы можете сделать следующее, дайте мне знать, если это решит ваш случай.

Этот метод в основном создает новую таблицу для замены существующей таблицы.Я использовал часть вашего кода

CREATE TABLE stage (LIKE target INCLUDING DEFAULTS);
INSERT INTO stage SELECT id, 'new' FROM target WHERE value=`old`;

Над INSERT вставляет строки, которые должны быть обновлены с помощью 'new', после этого не нужно запускать UPDATE.

Вывести неизмененные строки

INSERT INTO stage SELECT id, value FROM target WHERE value!=`old`;

После этого у вас есть таблица target, которая является вашей первоначальной неповрежденной таблицей * Таблица 1030 *

stage будет иметь оба набора строк, обновленные строки со значением 'new' и строки, которые вам не нужныизменить

заменить target на stage

DROP TABLE target;

или оставить его для дальнейшей проверки

ALTER TABLE target RENAME TO target_old; 

ALTER TABLE stage RENAME TO target; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...