Zmień typ danych kolumny w Amazon Redshift

85

Jak zmienić typ danych kolumny w bazie danych Amazon Redshift?

Nie mogę zmienić typu danych kolumny w Redshift; czy istnieje sposób na zmodyfikowanie typu danych w Amazon Redshift?

user1485267
źródło
6
„Utwórz tabelę jako wybierz…” I zaprojektuj nową tabelę z lepszym typem kolumny.
Guy

Odpowiedzi:

135

Jak wspomniano w dokumentacji ALTER TABLE , możesz zmienić długość VARCHARkolumn za pomocą

ALTER TABLE table_name
{
    ALTER COLUMN column_name TYPE new_data_type 
}

W przypadku innych typów kolumn jedyne, co przychodzi mi do głowy, to dodanie nowej kolumny z odpowiednim typem danych, a następnie wstawienie wszystkich danych ze starej kolumny do nowej i wreszcie usunięcie starej kolumny.

Użyj kodu podobnego do tego:

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;

Nastąpi zmiana schematu - nowo dodana kolumna będzie ostatnia w tabeli (może to być problem z COPYwyciągiem, pamiętaj - kolejność kolumn można zdefiniować za pomocą COPY)

Tomasz Tybulewicz
źródło
4
ALTER lub w tym przypadku każde oświadczenie DDL zostaje zatwierdzone natychmiast, niezależnie od pogody, jest zawarte w transakcji lub nie.
Raniendu Singh
@RanienduSingh Niektóre bazy danych obsługują transakcyjne instrukcje DDL. Nie znalazłem autorytatywnej listy, ale wydaje się, że większość instrukcji DDL w Redshift działa w transakcji. Myślę jednak, że zmiana kolejności operacji podobnych do opisanego tutaj podejścia (zmiana nazwy, dodanie, aktualizacja, upuszczenie) może być bardziej niezawodna: simple.com/engineering/safe-migrations-with-redshift
Matt Good
1
Warto zauważyć, że teraz można zwiększyć rozmiar kolumn varchar - zobacz odpowiedź użytkownika0000 poniżej i link do dokumentów ( docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html )
willis
1
@Tomasz Tybulewicz Czy mógłbyś zaktualizować swoją odpowiedź, w tym odpowiedź user0000? Twoja odpowiedź była wtedy poprawna, ale zostałem wprowadzony w błąd. Na szczęście przeczytałem również odpowiedź
user0000
43

aby uniknąć zmiany schematu, o której wspomniał Tomasz:

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;
Wolli
źródło
1
Jest to metoda, której również używamy, aby uniknąć nieprawidłowego wyrównania instrukcji kopiowania.
smb
1
Należy pamiętać, że wszystkie widoki, które były wybierane ze starej tabeli, nadal wskazują na starą tabelę. drop tableZapytanie pokaże błąd zależnościach, które mogą być, ale nie powinny być pominięte.
1
Dzięki za to, to było naprawdę pomocne. Użyłem go na stole z 31 milionami wierszy i zajęło to tylko 3 minuty przy użyciu typu dc1.large. Świetny! Użyłem też nieco prostszej formy:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
Tom
Hermetyzacja za pomocą TRANSACTION jest bardzo ważna
louis_guitton
16

(Ostatnia aktualizacja) Istnieje możliwość zmiany typu kolumn varchar w Redshift.

ALTER COLUMN column_name TYPE new_data_type

Przykład:

CREATE TABLE t1 (c1 varchar(100))

ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)

Oto link do dokumentacji

user0000
źródło
To działa doskonale. Niezła linijka, która w ogóle nie zmieni schematu, ale zaktualizuje typ danych. To powinna być nowa zaktualizowana odpowiedź!
Timothy Mcwilliams
8

Jeśli nie chcesz zmieniać kolejności kolumn , opcja będzie polegać na utworzeniu tabeli tymczasowej, upuszczeniu i utworzeniu nowej o żądanym rozmiarze, a następnie ponownie zbiorczo dane.

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;

Jedyny problem z odtworzeniem tabeli polega na tym, że będziesz musiał ponownie przyznać uprawnienia, a jeśli tabela jest zbyt duża, zajmie to trochę czasu.

Franzi
źródło
1
Jest to bardzo podobne do istniejącej odpowiedzi Wolli, aby zmienić nazwę, a następnie skopiować dane starej tabeli do nowego schematu. Oba zachowają kolejność kolumn, ale to rozwiązanie z tabelą tymczasową wymaga dwukrotnego skopiowania danych. Raz do skopiowania do tabeli tymczasowej, a drugi do skopiowania z powrotem do nowej tabeli. Zmiana nazwy tabeli powinna być szybsza, wykonując tylko jedną kopię.
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;
Anand Kumar
źródło
3

Redshift będąca kolumnową bazą danych nie pozwala na bezpośrednią modyfikację typu danych, jednak poniżej jest jedno podejście, które zmieni kolejność kolumn.

Kroki -

1. Zmień tabelę dodaj nową kolumnę do tabeli 2. Zaktualizuj wartość nowej kolumny o wartość starej kolumny 3. Zmień tabelę, aby usunąć starą kolumnę 4. Zmień tabelę, aby zmienić nazwę kolumny na starą kolumnę

Jeśli nie chcesz zmieniać kolejności kolumn, rozwiązaniem byłoby

1. utwórz tabelę tymczasową z nową nazwą kolumny

  1. skopiuj dane ze starej tabeli do nowej tabeli.

  2. upuść stary stół

  3. zmień nazwę newtable na oldtable

  4. Ważną rzeczą jest utworzenie nowej tabeli za pomocą podobnego polecenia zamiast prostego tworzenia.

Rama krishna
źródło
2

Ta metoda działa w przypadku konwersji (dużej) kolumny int na 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;
comfytoday
źródło
0

UNLOAD i COPY ze strategią zmiany nazwy tabeli powinny być najbardziej efektywnym sposobem wykonania tej operacji, jeśli ważne jest zachowanie struktury tabeli (kolejności wierszy).

Oto przykład dodawania do tej odpowiedzi.

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;
Alok Kumar Singh
źródło
-2

w przypadku aktualizacji tej samej kolumny z przesunięciem ku czerwieni działałoby to dobrze

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

możesz mieć wiele klauzul, gdzie, używając i, aby usunąć wszelkie nieporozumienia dla sql

Twoje zdrowie!!

achin saharawat
źródło