Wie ändere ich den Spaltendatentyp in der Amazon Redshift-Datenbank?
Ich kann den Spaltendatentyp in Redshift nicht ändern. Gibt es eine Möglichkeit, den Datentyp in Amazon Redshift zu ändern?
Wie ändere ich den Spaltendatentyp in der Amazon Redshift-Datenbank?
Ich kann den Spaltendatentyp in Redshift nicht ändern. Gibt es eine Möglichkeit, den Datentyp in Amazon Redshift zu ändern?
Antworten:
Wie in der Dokumentation zu ALTER TABLE angegeben , können Sie die Länge von VARCHAR
Spalten mithilfe von ändern
ALTER TABLE table_name
{
ALTER COLUMN column_name TYPE new_data_type
}
Bei anderen Spaltentypen kann ich mir nur vorstellen, eine neue Spalte mit einem korrekten Datentyp hinzuzufügen, dann alle Daten aus der alten Spalte in eine neue einzufügen und schließlich die alte Spalte zu löschen.
Verwenden Sie einen ähnlichen Code:
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;
Es wird eine Schemaänderung geben - die neu hinzugefügte Spalte wird die letzte in einer Tabelle sein (dies kann ein Problem mit der COPY
Anweisung sein, denken Sie daran - Sie können eine Spaltenreihenfolge mit definieren COPY
).
um die von Tomasz erwähnte Schemaänderung zu vermeiden:
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
Abfrage zeigt den Abhängigkeitsfehler an, der umgangen werden kann, aber nicht umgangen werden sollte.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(Letzte Aktualisierung) Es ist möglich, den Typ für Varchar-Spalten in Redshift zu ändern.
ALTER COLUMN column_name TYPE new_data_type
Beispiel:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
Hier ist die Dokumentation Link
Wenn Sie die Spaltenreihenfolge nicht ändern möchten , können Sie eine temporäre Tabelle erstellen, die neue Tabelle mit der gewünschten Größe löschen und erstellen und dann die Daten erneut zusammenfassen.
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;
Das einzige Problem beim Neuerstellen der Tabelle besteht darin, dass Sie erneut Berechtigungen erteilen müssen. Wenn die Tabelle zu groß ist, dauert dies einige Zeit.
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;
Da Redshift eine spaltbare Datenbank ist, können Sie den Datentyp nicht direkt ändern. Im Folgenden finden Sie jedoch einen Ansatz, mit dem die Spaltenreihenfolge geändert wird.
Schritte -
1.Alter-Tabelle Hinzufügen einer neuen Spalte zur Tabelle 2. Aktualisieren Sie den Wert der neuen Spalte mit dem Wert der alten Spalte 3.Alter-Tabelle zum Löschen der alten Spalte 4. Alter-Tabelle zum Umbenennen der Spalte in die alte Spalte
Wenn Sie die Reihenfolge der Spalten nicht ändern möchten, ist die Lösung zu
1.Erstellen Sie eine temporäre Tabelle mit einem neuen Spaltennamen
Kopieren Sie Daten von der alten Tabelle in die neue Tabelle.
alten Tisch fallen lassen
Benennen Sie die Newtable in Oldtable um
Eine wichtige Sache ist, eine neue Tabelle mit dem Befehl like zu erstellen, anstatt einfach zu erstellen.
Diese Methode funktioniert zum Konvertieren einer (großen) int-Spalte in einen 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;
Für die Aktualisierung derselben Spalte in Rotverschiebung würde dies gut funktionieren
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
Sie können mehrere Klauseln verwenden, indem Sie und verwenden, um Verwirrung für SQL zu vermeiden
Prost!!