Comment modifier le type de données de la colonne dans la base de données Amazon Redshift?
Je ne suis pas en mesure de modifier le type de données de la colonne dans Redshift; Est-il possible de modifier le type de données dans Amazon Redshift?
Il n’existe actuellement aucun moyen de modifier une colonne dans une base de données redshift.
Tout ce que je peux penser, c’est d’ajouter une nouvelle colonne avec un type de données correct, puis d’insérer toutes les données de l’ancienne colonne dans une nouvelle et de supprimer définitivement l’ancienne colonne.
Utilisez un code similaire à celui-ci:
ALTER TABLE t1 ADD COLUMN new_column (___correct_column_definition___);
UPDATE t1 SET new_column = column;
ALTER TABLE t1 DROP COLUMN column;
ALTER TABLE t1 RENAME COLUMN new_column TO column;
Il y aura un changement de schéma - la colonne nouvellement ajoutée sera la dernière dans une table (cela peut être un problème avec l'instruction COPY
, gardez cela à l'esprit - vous pouvez définir un ordre de colonne avec COPY
)
pour éviter le changement de schéma mentionné par 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;
Si vous ne voulez pas modifier l'ordre des colonnes, une option sera la création d'une table temporaire, la suppression et la création d'une nouvelle table à la taille souhaitée, puis le regroupement des données.
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;
Le seul problème pour recréer la table est que vous devrez accorder de nouveau des autorisations et si la table est trop grande, cela prendra un peu de temps.
Mise à jour récente (à compter du 15 mars 2019) de Redshift
Dans la documentation, https://docs.aws.Amazon.com/redshift/latest/dg/r_ALTER_TABLE.html
ALTER COLUMN nom_colonne TYPE type_données_nouvelles
Clause qui augmente la taille d'une colonne utilisant un type de données VARCHAR. Vous pouvez utiliser ALTER COLUMN uniquement avec VARCHAR. Vous pouvez augmenter la taille de la colonne VARCHAR, mais vous ne pouvez pas la diminuer. Vous ne pouvez pas modifier une colonne comportant une clé primaire, une clé étrangère ou des contraintes uniques. Vous ne pouvez modifier qu'une seule colonne dans chaque commande ALTER TABLE. Vous ne pouvez pas utiliser ALTER COLUMN dans un bloc de transaction (BEGIN ... END).
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;
(Mise à jour récente) Il est possible de modifier le type des colonnes varchar dans Redshift.
ALTER COLUMN column_name TYPE new_data_type
Exemple:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
Voici la documentation lien
Redshift étant une base de données en colonnes, vous ne pouvez pas modifier le type de données directement, mais vous trouverez ci-dessous une approche qui changera l'ordre des colonnes.
Pas -
1.Alter table ajoute newcolumn à la table 2.Mettez à jour la valeur de newcolumn avec oldcolumn 3.Alter table pour supprimer oldcolumn 4.alter table afin de renommer columnn.
Si vous ne voulez pas modifier l’ordre des colonnes, la solution serait de:
1.créer une table temporaire avec un nouveau nom de colonne
copier les données de l'ancienne table dans la nouvelle table.
déposer la vieille table
renommer la newtable à oldtable
Une chose importante est de créer une nouvelle table en utilisant une commande similaire à la place d'une simple création.
Cette méthode fonctionne pour convertir une (grande) colonne int en 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;