Змінити тип даних стовпця в Amazon Redshift


85

Як змінити тип даних стовпців у базі даних Amazon Redshift?

Я не можу змінити тип даних стовпця в Redshift; чи є спосіб змінити тип даних в Amazon Redshift?


6
"Створити таблицю за вибором ..." І створи нову таблицю з кращим типом стовпця.
Guy

Відповіді:


135

Як зазначено в документації 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 бере на себе зобов’язання негайно, незалежно від погоди, якщо він завернутий у транзакцію чи ні.
Раніенду Сінгх,

@RanienduSingh деякі бази даних підтримують транзакційні оператори DDL. Я не знайшов авторитетного списку, але більшість операторів DDL у Redshift, здається, працюють під час транзакції. Однак я думаю, що переупорядкування операцій, подібних до описаного тут підходу (перейменування, додавання, оновлення, скидання), може бути більш надійним: simple.com/engineering/safe-migrations-with-redshift
Matt Good

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;
Том,

Інкапсуляція
транзакцією

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 перейменувати, а потім скопіювати старі дані таблиці в нову схему. Обидва вони зберігатимуть порядок стовпців, але це рішення з тимчасовою таблицею вимагає копіювання даних двічі. Один раз скопіювати в тимчасову таблицю, а інший скопіювати назад у нову таблицю. Перейменування таблиці має бути швидшим, виконавши лише одну копію.
Matt Good

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. перейменувати newtable на oldtable

  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

РАЗГРУЗКА та КОПІЮВАННЯ зі стратегією перейменування таблиці повинні бути найефективнішим способом зробити цю операцію, якщо важливо зберегти структуру таблиці (порядок рядків).

Ось приклад, що додається до цієї відповіді.

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.