如何在Redshift中创建后更改表模式?

时间:2014-03-21 02:13:41

标签: amazon-redshift

Postgre支持此操作如下:

ALTER TABLE name
    SET SCHEMA new_schema

该操作在Redshift中不起作用。有没有办法做到这一点?

我尝试更新pg_class以设置表的relnamespace(模式ID),这需要超级用户帐户并且pg_shadow表中的usecatupd为true。但我得到了许可否认错误。唯一可以修改pg系统表的帐户是rdsdb。

server=# select * from pg_user;
 usename   | usesysid | usecreatedb | usesuper | usecatupd |  passwd  | valuntil |            useconfig             
------------+----------+-------------+----------+-----------+----------+----------+----------------------------------
 rdsdb      |        1 | t           | t        | t         | ******** |          | 
 myuser     |      100 | t           | t        | f         | ******** |          | 

所以真的红移不给予许可吗?

4 个答案:

答案 0 :(得分:22)

最快的方法现在如下:

CREATE TABLE my_new_schema.my_table (LIKE my_old_schema.my_table);
ALTER TABLE my_new_schema.my_table APPEND FROM my_old_schema.my_table;
DROP TABLE my_old_schema.my_table;

在这种情况下,my_old_schema.my_table的数据只会重新映射为属于my_new_schema.my_table。比做INSERT INTO快得多。

请注意,可能必须删除并重新创建依赖于my_old_schema.my_table的任何视图。 更新:如果您定期执行此操作,则应使用WITH NO SCHEMA BINDING创建视图,并且他们将继续指向正确的表格而无需重新创建。

答案 1 :(得分:6)

最好的方法是使用所需的模式创建一个新表,然后使用旧表中的数据执行INSERT .... SELECT。

然后删除当前表并使用ALTER TABLE重命名新表。

答案 2 :(得分:4)

您可以使用

创建新表

CREATE TABLE schema1.tableName(LIKE schema2.tableName包含默认值);

然后使用INSERT INTO语句将表的内容从一个模式复制到另一个模式

后跟DROP TABLE删除表。

答案 3 :(得分:-2)

我就是这样做的。

- 如果您已有一个备份

,则删除
DROP TABLE IF EXISTS TABLE_NAME_BKP CASCADE;

- 创建两个备份,一个工作,最后将被删除,还有一个是真正的备份

SELECT * INTO TABLE_NAME_BKP FROM TABLE_NAME;
SELECT * INTO TABLE_NAME_4_WORK FROM TABLE_NAME;

- 我们也可以执行下面的ALTER,但它保存主键约束名称,因此您无法创建具有相同约束名称的新表

ALTER TABLE TABLE_NAME RENAME TO TABLE_NAME_4_WORK;

- 确保您已复制

SELECT COUNT(*) FROM TABLE_NAME;
SELECT COUNT(*) FROM TABLE_NAME_4_WORK; 

- 创建新的表架构

    DROP TABLE IF EXISTS TABLE_NAME CASCADE;

    CREATE TABLE TABLE_NAME     (
       ID           varchar(36)     NOT NULL,
       OLD_COLUMN   varchar(36),
       NEW COLUMN_1 varchar(36)
    )
    compound sortkey (ID, OLD_COLUMN, NEW COLUMN_1);

    ALTER TABLE TABLE_NAME
    ADD CONSTRAINT PK__TAB_NAME__ID
    PRIMARY KEY (id);

- 将数据从旧复制到新

INSERT INTO TABLE_NAME (
     id,    
     OLD_COLUMN)
 (SELECT     
     id,        
     OLD_COLUMN FROM TABLE_NAME_4_WORK) 

- 删除工作表TABLE_NAME_4_WORK

 DROP TABLE TABLE_NAME_4_WORK;

- 比较BKP和新表行,并保留BKP表格。

 SELECT COUNT(*) FROM TABLE_NAME_BKP;

 SELECT COUNT(*) FROM TABLE_NAME;