Изменить тип данных столбца в Amazon Redshift


85

Как изменить тип данных столбца в базе данных Amazon Redshift?

Я не могу изменить тип данных столбца в Redshift; есть ли способ изменить тип данных в Amazon Redshift?


6
«Создать таблицу как выберите ...» И создайте новую таблицу с лучшим типом столбца.
Guy

Ответы:


137

Как отмечено в документации ALTER TABLE , вы можете изменить длину VARCHARстолбцов, используя

ALTER TABLE table_name
{
    ALTER COLUMN column_name TYPE new_data_type 
}

Для других типов столбцов все, что я могу придумать, - это добавить новый столбец с правильным типом данных, затем вставить все данные из старого столбца в новый и, наконец, удалить старый столбец.

Используйте код, похожий на этот:

ALTER TABLE t1 ADD COLUMN new_column ___correct_column_type___;
UPDATE t1 SET new_column = column;
ALTER TABLE t1 DROP COLUMN column;
ALTER TABLE t1 RENAME COLUMN new_column TO column;

Произойдет изменение схемы - новый добавленный столбец будет последним в таблице (это может быть проблемой с COPYоператором, имейте это в виду - вы можете определить порядок столбцов с помощью COPY)


4
ALTER или, если на то пошло, любой оператор DDL фиксируется немедленно, независимо от того, заключен он в транзакцию или нет.
Raniendu Singh

@RanienduSingh некоторые базы данных действительно поддерживают операторы транзакционного DDL. Я не нашел авторитетного списка, но большинство операторов DDL в Redshift, похоже, работают в транзакции. Однако я думаю, что изменение порядка операций, аналогичных описанному здесь подходу (переименование, добавление, обновление, удаление
Мэтт Гуд

1
Стоит отметить, что теперь можно увеличить размер столбцов varchar - см. Ответ user0000 ниже и ссылку на документы ( docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html )
willis

1
@Tomasz Tybulewicz, не могли бы вы обновить свой ответ, включая ответ user0000? В то время ваш ответ был правильным, но меня обманули. К счастью, я тоже прочитал ответ
user0000

43

чтобы избежать изменения схемы, упомянутого Томашем:

BEGIN TRANSACTION;

ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
INSERT INTO <TABLE_NAME> (<NEW_COLUMN_DEFINITION>)
SELECT <COLUMNS>
FROM <TABLE_NAME>_OLD;
DROP TABLE <TABLE_NAME>_OLD;

END TRANSACTION;

1
Мы также используем этот метод, чтобы избежать смещения оператора копирования.
smb

1
Имейте в виду, что любые представления, которые использовались для выбора из старой таблицы, продолжают указывать на старую таблицу. drop tableЗапрос покажет ошибку зависимости , которая может быть , но не должно быть обойдены.

1
Спасибо за это, это действительно помогло. Я использовал его на таблице с 31 миллионом строк, и это заняло всего 3 минуты с использованием типа dc1.large. Большой! Я также использовал немного более простую форму:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
Tom

Инкапсуляция с помощью TRANSACTION очень важна
louis_guitton

16

(Недавнее обновление) В Redshift можно изменить тип столбцов varchar.

ALTER COLUMN column_name TYPE new_data_type

Пример:

CREATE TABLE t1 (c1 varchar(100))

ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)

Вот ссылка на документацию


Это прекрасно работает. Хороший лайнер, который вообще не изменяет схему, а обновляет тип данных. Это должен быть новый обновленный ответ!
Тимоти Маквильямс

8

Если вы не хотите изменять порядок столбцов , можно будет создать временную таблицу, отбросить и создать новую с желаемым размером, а затем снова собрать данные.

CREATE TEMP TABLE temp_table AS SELECT * FROM original_table;
DROP TABLE original_table;
CREATE TABLE original_table ...
INSERT INTO original_table SELECT * FROM temp_table;

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


1
Это очень похоже на существующий ответ от Wolli на переименование, а затем копирование данных старой таблицы в новую схему. Оба будут сохранять порядок столбцов, но это решение с временной таблицей требует двойного копирования данных. Один раз скопировать во временную таблицу, а другой скопировать обратно в новую таблицу. Переименование таблицы должно быть быстрее за счет выполнения только одной копии.
Мэтт Гуд

4
ALTER TABLE publisher_catalogs ADD COLUMN new_version integer;

update publisher_catalogs set new_version = CAST(version AS integer);
ALTER TABLE publisher_catalogs DROP COLUMN version RESTRICT;
ALTER TABLE publisher_catalogs RENAME new_version to version;

3

Redshift, являющийся колоночной базой данных, не позволяет вам напрямую изменять тип данных, однако ниже представлен один из подходов, который изменит порядок столбцов.

Шаги -

1. изменить таблицу, добавить новый столбец в таблицу 2. обновить значение нового столбца значением старого столбца 3. изменить таблицу, чтобы удалить старый столбец 4. изменить таблицу, чтобы переименовать столбец в старый столбец

Если вы не хотите изменять порядок столбцов, решение будет заключаться в

1. создать временную таблицу с новым именем столбца

  1. копировать данные из старой таблицы в новую.

  2. сбросить старую таблицу

  3. переименуйте новую таблицу в старую таблицу

  4. Одна важная вещь - создать новую таблицу, используя команду like вместо простого create.


2

Этот метод работает для преобразования (большого) столбца int в varchar

-- Create a backup of the original table
create table original_table_backup as select * from original_table;

-- Drop the original table, and then recreate with new desired data types
drop table original_table;

create table original_table (
  col1 bigint,
  col2 varchar(20) -- changed from bigint
);

-- insert original entries back into the new table
insert into original_table select * from original_table_backup;

-- cleanup
drop original_table_backup;

0

UNLOAD и COPY со стратегией переименования таблицы должны быть наиболее эффективным способом выполнения этой операции, если важно сохранить структуру таблицы (порядок строк).

Вот пример добавления к этому ответу.

BEGIN TRANSACTION;

ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
UNLOAD ('select * from <TABLE_NAME>_OLD') TO 's3://bucket/key/unload_' manifest;
COPY <TABLE_NAME> FROM 's3://bucket/key/unload_manifest'manifest;

END TRANSACTION;

-2

для обновления того же столбца в красном смещении это будет работать нормально

UPDATE table_name 
SET column_name = 'new_value' WHERE column_name = 'old_value'

у вас может быть несколько предложений в where, используя и, чтобы устранить любую путаницу для sql

ура !!

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.