web-dev-qa-db-fra.com

Redshift - Comment supprimer la contrainte NOT NULL?

Redshift ne prenant pas en charge ALTER COLUMN, je voudrais savoir s’il est possible de supprimer les contraintes NOT NULL des colonnes de Redshift.

14
shihpeng

Vous ne pouvez pas modifier la table.

Il y a une approche alternative. Vous pouvez créer une nouvelle colonne avec une contrainte NULL. Copiez les valeurs de votre ancienne colonne dans cette nouvelle colonne, puis supprimez l’ancienne colonne.

Quelque chose comme ça:

ALTER TABLE table1 ADD COLUMN somecolumn (definition as per your reqm);
UPDATE table1 SET somecolumn = oldcolumn;
ALTER TABLE table1 DROP COLUMN oldcolumn;
ALTER TABLE table1 RENAME COLUMN somecolumn TO oldcolumn;
24
Rahul Tripathi

Il n'y a aucun moyen de changer de colonne sur Redshift .

Je peux vous suggérer de créer une nouvelle colonne, de copier les valeurs d'une ancienne colonne vers une autre et de supprimer l'ancienne colonne.

ALTER TABLE Table1 ADD COLUMN new_column (___correct_column_definition___);
UPDATE Table1 SET new_column = column;
ALTER TABLE Table1 DROP COLUMN column;
ALTER TABLE Table1 RENAME COLUMN new_column TO column;

La réponse acceptée peut produire une erreur:

cannot drop table <table_name> column <column_name> because other objects depend on it

AjouterCASCADEà la fin de l'instruction DROP COLUMN résoudra ce problème. Assurez-vous simplement qu'un autre objet ne dépend pas de lui en premier.

ALTER TABLE table1 ADD COLUMN newcolumn (definition as per your reqirements);
UPDATE table1 SET newcolumn = oldcolumn;
ALTER TABLE table1 DROP COLUMN oldcolumn CASCADE;
ALTER TABLE schema_name.table1 RENAME COLUMN newcolumn TO oldcolumn;

J'ai trouvé cette information ici, alors que la réponse acceptée ne me convenait pas: https://forums.aws.Amazon.com/message.jspa?messageID=463248

Remarque: lorsque j'ai essayé de renommer la colonne, une autre erreur s'est produite: la relation N'existe pas.

Pour résoudre ce problème, j'ai ajouté le nom du schéma devant le nom de la table dans RENAME COLUMN statement

1
cjromb