Postgres继承中断了吗?

时间:2019-06-19 11:23:35

标签: postgresql

在父表上使用DROP COLUMN column_name后,不会删除子表中的某些列。

如何用这种行为重新分配列以在将来正确地级联删除?

如何复制: 有两个表:parentchild。子级从父级继承,并具有相同的列。 在子项中添加新列test。在父级中添加新列test。之后,test中的子项将从父项继承。 尝试从父级删除test-希望从子级级删除test。但它仍然存在。

CREATE TABLE parent (a INT);
CREATE TABLE child () INHERITS (parent);
ALTER TABLE child ADD COLUMN test_inherit VARCHAR;
ALTER TABLE parent ADD COLUMN test_inherit VARCHAR;
ALTER TABLE parent DROP COLUMN test_inherit;

1 个答案:

答案 0 :(得分:3)

这里发生的是,表child上的列未标记为继承列:

CREATE TABLE parent (a INT);
CREATE TABLE child (a INT) INHERITS (parent);
NOTICE:  merging column "a" with inherited definition
ALTER TABLE child ADD COLUMN test_inherit VARCHAR;
ALTER TABLE parent ADD COLUMN test_inherit VARCHAR;
NOTICE:  merging definition of column "test_inherit" for child "child"

SELECT attname, attnum, attislocal
FROM pg_attribute
WHERE attrelid = 'child'::regclass AND attnum > 0;

   attname    | attnum | attislocal 
--------------+--------+------------
 a            |      1 | t
 test_inherit |      2 | t
(2 rows)

attislocal表示它是直接在child上定义的列,由于从另一个表继承而不会自动创建。

如果您定义的子表不包含任何列,则这些列将是继承的列:

DROP TABLE parent, child;
CREATE TABLE parent (a INT, test_inherit VARCHAR);
CREATE TABLE child () INHERITS (parent);

SELECT attname, attnum, attislocal
FROM pg_attribute
WHERE attrelid = 'child'::regclass AND attnum > 0;

   attname    | attnum | attislocal 
--------------+--------+------------
 a            |      1 | f
 test_inherit |      2 | f
(2 rows)

如果删除父级中的列,则仅删除继承的列:

ALTER TABLE parent DROP COLUMN test_inherit;

\d child
               Table "laurenz.child"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 a      | integer |           |          | 
Inherits: parent