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?
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?
Odpowiedzi:
Jak wspomniano w dokumentacji ALTER TABLE , możesz zmienić długość VARCHAR
kolumn 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 COPY
wyciągiem, pamiętaj - kolejność kolumn można zdefiniować za pomocą COPY
)
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;
drop table
Zapytanie pokaże błąd zależnościach, które mogą być, ale nie powinny być pominięte.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(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
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.
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;
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
skopiuj dane ze starej tabeli do nowej tabeli.
upuść stary stół
zmień nazwę newtable na oldtable
Ważną rzeczą jest utworzenie nowej tabeli za pomocą podobnego polecenia zamiast prostego tworzenia.
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;
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;
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!!