Come modificare il tipo di dati della colonna nel database di Amazon Redshift?
Non sono in grado di modificare il tipo di dati della colonna in Redshift; c'è un modo per modificare il tipo di dati in Amazon Redshift?
Come modificare il tipo di dati della colonna nel database di Amazon Redshift?
Non sono in grado di modificare il tipo di dati della colonna in Redshift; c'è un modo per modificare il tipo di dati in Amazon Redshift?
Risposte:
Come indicato nella documentazione di ALTER TABLE , è possibile modificare la lunghezza delle VARCHAR
colonne utilizzando
ALTER TABLE table_name
{
ALTER COLUMN column_name TYPE new_data_type
}
Per altri tipi di colonna tutto ciò a cui riesco a pensare è aggiungere una nuova colonna con un tipo di dati corretto, quindi inserire tutti i dati dalla vecchia colonna a una nuova e infine rilasciare la vecchia colonna.
Usa un codice simile a quello:
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;
Ci sarà una modifica dello schema: la colonna appena aggiunta sarà l'ultima in una tabella (potrebbe essere un problema con l' COPY
istruzione, tienilo a mente: puoi definire un ordine di colonna con COPY
)
per evitare il cambio di schema menzionato da 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
query mostrerà l'errore di dipendenza che può essere ma non dovrebbe essere ignorato.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(Aggiornamento recente) È possibile modificare il tipo per le colonne varchar in Redshift.
ALTER COLUMN column_name TYPE new_data_type
Esempio:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
Ecco il link alla documentazione
Se non desideri modificare l'ordine delle colonne , un'opzione creerà una tabella temporanea, rilascia e crea quella nuova con le dimensioni desiderate e quindi raggruppa nuovamente i dati.
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;
L'unico problema nel ricreare la tabella è che dovrai concedere nuovamente i permessi e se la tabella è troppo grande ci vorrà un po 'di tempo.
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 essendo un database colonnare non ti consente di modificare direttamente il tipo di dati, tuttavia di seguito è un approccio che cambierà l'ordine delle colonne.
Passi -
1.Alter table aggiungi newcolumn alla tabella 2.Aggiorna il valore newcolumn con il valore oldcolumn 3.Alter table per eliminare la oldcolumn 4.alter table per rinominare la columnn in oldcolumn
Se non vuoi modificare l'ordine delle colonne, la soluzione sarebbe
1.crea una tabella temporanea con un nuovo nome di colonna
copia i dati dalla vecchia tabella alla nuova tabella.
lascia cadere il vecchio tavolo
rinominare la newtable in oldtable
Una cosa importante è creare una nuova tabella usando il comando like invece della semplice creazione.
Questo metodo funziona per convertire una (grande) colonna int in un 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;
SCARICARE e COPIARE con la strategia di ridenominazione della tabella dovrebbe essere il modo più efficiente per eseguire questa operazione se è importante mantenere la struttura della tabella (ordine delle righe).
Ecco un esempio che si aggiunge a questa risposta.
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;
per aggiornare la stessa colonna in redshift questo funzionerebbe bene
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
puoi avere più clausole in cui usando e, in modo da rimuovere qualsiasi confusione per sql
Saluti!!