2017-06-09 12 views
2

我在我的PostgreSQL数据库中有几个具有几个公共列的表。我认为如果将这些公共列移入新表并使表从这个新表继承,这将是一个好主意。例如:修改表的模式,使其从另一个表继承而不重新创建表或重新插入数据

create table foo_bar (
    code varchar(9) primary key, 
    name varchar, 
    bar integer 
); 

重构后:

create table foo (
    code varchar(9) primary key, 
    name varchar 
); 

create table foo_bar (
    bar integer 
) inherits (foo); 

的问题是,我有很多的foo_bar数据,以及许多意见认为参考这个表。

是否可以更改foo_bar的定义以实现上述更改而不丢弃表中的数据?

回答

1
CREATE TABLE foo (
    code varchar(9), 
    name varchar 
); 

ALTER TABLE foo_bar INHERIT foo; 
+0

哈!我不认为这会很容易。我测试了它,它工作。唯一奇怪的是现在,如果我转储数据库,它显式地显示'foo_bar'定义中的继承列。我不应该看到他们。但是他们真的被继承了,如果我试图从'foo_bar'丢弃这些列,我得到一个错误,说我不能让它们被继承。谢谢! – piokuc

2

这可能也可能不是一个好主意。数据库设计不完全是面向对象的编程。有一些caveats

继承特性的一个严重的局限性是索引 (包括唯一约束)和外键约束只适用 单表,而不是他们的子女继承。 在外键约束的引用和引用方都是如此。

并且您需要了解的链接中描述的问题还很少。

如果你真的想要这样做,如何改变表在Laurenz Albe的答案中给出。

+0

谢谢。在我的情况下,警告不是问题,我可以选择基表并让PostgreSQL自动选择所有“子表”是非常有用的。 – piokuc

相关问题