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

elp*_*rup 14 amazon-redshift

Postgre支持此操作如下:

ALTER TABLE name
    SET SCHEMA new_schema
Run Code Online (Sandbox Code Playgroud)

该操作在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         | ******** |          | 
Run Code Online (Sandbox Code Playgroud)

那真正的红移没有给予许可吗?

Joe*_*ris 26

现在最快的方法如下:

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;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,数据my_old_schema.my_table仅被重新映射为属于my_new_schema.my_table.比做一个快得多INSERT INTO.

请注意,您可能必须删除并重新创建依赖的任何视图my_old_schema.my_table.更新:如果您经常这样做,您应该使用创建视图WITH NO SCHEMA BINDING,他们将继续指向正确的表,而无需重新创建.

  • 这种方法需要注意的一件事是,虽然它确实很快,但它最终也会在操作结束时清空源表。通过艰难的方式了解到这一点,我希望在运行两次并以空的源表和目标表结束后,我已经在 ALTER TABLE ... APPEND 操作上完成了 RTFM 的所有重要步骤。答案虽然有效。 (3认同)
  • 由于视图存在问题,我建议创建视图"WITH NO SCHEMA BINDING". (2认同)

小智 6

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

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

  • 注意,如果使用`create newschema.table1(如table1)创建新表;`sortkey,distkey和constraints将被复制,但主键和外键不会复制(它们无论如何都是信息性的).你也可以将表从`select*复制到table1中的newschema.table1;`而不必先创建新表,尽管这不会复制非空约束,主键和外键. (2认同)

小智 5

您可以创建一个新表

CREATE TABLE schema1.tableName( LIKE schema2.tableName INCLUDING DEFAULTS ) ;

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

后跟 DROP TABLE 删除表。