2015-09-04 31 views
3

基本上我想这样做:如何替换postgres中的表格?

begin; 
lock table a; 
alter table a rename to b; 
alter table a1 rename to a; 
drop table b; 
commit; 

即增益控制和取代旧表,而没有人访问它。

+0

您能更具体地了解您卡在哪里或您无法实现的目标吗? –

+0

并非如此。当我在命令行尝试它时出现错误,但可能有一个现有的表或导致它的错误解释。因此你有最好的答案。 ;-) – user3416742

+3

然后请指定您正在获取的错误。 –

回答

5

简单:

BEGIN; 
DROP TABLE a; 
ALTER TABLE a1 RENAME TO a; 
COMMIT; 

DROP TABLE反正获取表的ACCESS EXCLUSIVE锁。明确的LOCK命令不会更好。重命名死人只是浪费时间。

尝试访问表的并发事务会发生什么情况?这并不是说简单的,这样说的:

解释了为什么你可能已经看到错误消息是这样的:

ERROR: could not open relation with OID 123456 
+4

还要注意,这个和原始解决方案都不会保留引用表的'FOREIGN KEY'约束,引用表的视图等.DROP'将失败。如果你“DROP ... CASCADE”,那么引用视图,约束等会被删除,并且当你创建/重命名替换表时,将不会重新创建。目前还没有一种方便的方式来“交换”两个表并保持FK限制等。 –

0

创建SQL备份,进行修改您需要直接在backup.sql文件并恢复数据库。当添加INHERIT用于一组表(Postgres dbms)以从子表中删除继承的字段时,我使用了这个技巧。