【发布时间】:2023-03-11 08:40:02
【问题描述】:
由于 Redshift 不支持ALTER COLUMN,我想知道是否可以从 Redshift 中的列中删除 NOT NULL 约束。
【问题讨论】:
标签: sql amazon-redshift
由于 Redshift 不支持ALTER COLUMN,我想知道是否可以从 Redshift 中的列中删除 NOT NULL 约束。
【问题讨论】:
标签: sql amazon-redshift
您不能更改表格。
还有一种替代方法。您可以创建一个具有 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;
【讨论】:
没有办法改变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 语句中的表名前面添加了架构名称
【讨论】:
CASCADE 将 产生不必要的副作用。注释Just make sure another object doesn't depend on it first. 毫无意义;如果另一个对象不依赖它,则不会出现错误消息...