在父表上使用DROP COLUMN column_name
后,不会删除子表中的某些列。
如何用这种行为重新分配列以在将来正确地级联删除?
如何复制:
有两个表:parent
和child
。子级从父级继承,并具有相同的列。
在子项中添加新列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;
答案 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