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 | ******** | |
所以真的红移不给予许可吗?
答案 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;