在父表上使用后,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;
Run Code Online (Sandbox Code Playgroud)
这里发生的情况是表上的列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)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
如果删除继承父级中的列,则仅删除继承的列:
ALTER TABLE parent DROP COLUMN test_inherit;
\d child
Table "laurenz.child"
Column | Type | Collation | Nullable | Default
--------+---------+-----------+----------+---------
a | integer | | |
Inherits: parent
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2025 次 |
| 最近记录: |