2

有人可以帮我弄这个吗?我有一组从单个父表继承的表(现在所有这些表都包含数据)。

我需要从父表中删除特定列,并且应该自动删除所有继承表中的同一列。这可能吗?

当我尝试这个时,只删除了父表列。我也在alter表中尝试了级联选项,但没有结果。

我正在使用 postgreSql 8.3

4

3 回答 3

3

我刚刚在 Postgres 9.3 中遇到了同样的问题。该问题似乎仅在以下情况下存在:

1)

create table parent_table(a int);
create table child_table(a int) inherits (parent_table);

2)

create table parent_table(a int);
create table child_table(a int);
alter table child_table INHERIT parent_table;

场景 2) 比 1) 更有可能,因为在 1) 中,您可以改为:

create table parent_table(a int);
create table child_table() inherits (parent_table);

并在两个表中获得相同的列。

然而,在场景 2) 中,child_table 必须具有 parent_table 的所有列及其约束。根据 Postgres文档

继承父表

此表单将目标表添加为指定父表的新子表。随后,针对父表的查询将包括目标表的记录。要作为子表添加,目标表必须已经包含与父表相同的所有列(它也可以有其他列)。这些列必须具有匹配的数据类型,并且如果它们在父级中具有 NOT NULL 约束,那么它们在子级中也必须具有 NOT NULL 约束。

对于父级的所有 CHECK 约束,还必须有匹配的子表约束。目前不考虑 UNIQUE、PRIMARY KEY 和 FOREIGN KEY 约束,但将来可能会改变。

这样做的结果是,如果您在事后向表添加了继承,然后在父表中删除了一个列,那么即使您使用 DROP CASCADE,该列也不会从子表中删除。

于 2015-04-10T14:50:48.723 回答
1

当我们通过循环遍历所有继承表来添加列时,然后从主表中删除列并不会从每个继承表中删除,它会从每个继承表中删除,只有当我们通过将列添加到主表来添加列时。也没有'CASCADE; 是必须的。(用 PostgreSQl 检查)

ALTER TABLE 'Table_Name' ADD COLUMN IF NOT EXISTS 'Col_Name' 'type'
ALTER TABLE 'Table_Name' DROP COLUMN IF EXISTS 'Col_Name'
于 2021-07-30T11:19:01.813 回答
0

当一列被删除到父表中时,它也应该被删除到继承的表中。手册说:

ALTER TABLE 将传播列数据定义中的任何更改并检查继承层次结构中的约束。同样,只有在使用 CASCADE 选项时才能删除父表上的列或约束。ALTER TABLE 遵循与 CREATE TABLE 期间应用的重复列合并和拒绝相同的规则。

尝试这个:

create table parent_table(a int, b int);
create table child_table(c int) inherits (parent_table);

结果:

# \d child_table
  表“public.child_table”
 专栏 | 类型 | 修饰符
--------+----------+------------
 一个 | 整数 |
 乙 | 整数 |
 c | 整数 |
继承:父表

现在让我们在中删除一列parent_table

alter table parent_table drop column a cascade;

结果:

\d 子表
  表“public.child_table”
 专栏 | 类型 | 修饰符
--------+----------+------------
 乙 | 整数 |
 c | 整数 |
继承:父表

DROP COLUMN 已按预期传播到子表。

如果您的表定义得到不同的结果,您应该在问题以及 drop SQL 语句中包含这些定义。

于 2013-01-09T14:52:35.547 回答