web-dev-qa-db-ja.com

Redshift-NOT NULL制約を削除する方法

RedshiftはALTER COLUMNをサポートしていないため、Redshiftの列からNOT NULL制約を削除できるかどうか知りたいのですが。

17
shihpeng

テーブルを変更することはできません。

別の方法があります。 NULL制約で新しい列を作成できます。古い列からこの新しい列に値をコピーしてから、古い列をドロップします。

このようなもの:

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;
30
Rahul Tripathi

Redshiftで列を変更する方法はありません。

新しい列を作成し、古い列から新しい列に値をコピーして、古い列を削除することをお勧めします。

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;

受け入れられた答えはエラーを引き起こす可能性があります:

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

DROP COLUMNステートメントの最後に[〜#〜] cascade [〜#〜]を追加すると、これが修正されます。別のオブジェクトが最初にそれに依存しないことを確認してください。

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;

受け入れられた回答がうまくいかなかったときに、この情報をここに見つけました: https://forums.aws.Amazon.com/message.jspa?messageID=463248

また、注意:列の名前を変更しようとすると、別のエラーが発生しました:リレーションが存在しません

これを修正するために、RENAME COLUMNステートメントのテーブル名の前にスキーマ名を追加しました

2
cjromb