在 PostgreSQL 中,使用 INHERITS
创建的子表对主表的更改行为如下:
1. 新增字段
-
行为:子表会自动继承主表新增的字段。
-
示例:
CREATE TABLE parent_table (id SERIAL PRIMARY KEY, name TEXT); CREATE TABLE child_table () INHERITS (parent_table); ALTER TABLE parent_table ADD COLUMN age INT;
结果:
child_table
会自动包含age
字段。
2. 创建索引
-
行为:主表创建的索引不会自动应用到子表。
如果需要在子表上创建相同的索引,需手动执行或使用脚本。 -
示例:
CREATE INDEX idx_name ON parent_table (name);
结果:索引
idx_name
只存在于parent_table
,不会影响child_table
。解决方案:使用脚本遍历子表手动创建索引。
3. 新增约束
- 主键或唯一约束:不会自动继承,需要在每个子表中手动添加。
结果:唯一约束只作用于主表的数据,ALTER TABLE parent_table ADD CONSTRAINT unique_name UNIQUE (name);
child_table
的数据不受影响。 - 外键约束: 不会自动继承,需要在每个子表中手动添加
-- 创建父表和引用表
CREATE TABLE referenced_table (
id SERIAL PRIMARY KEY
);
CREATE TABLE parent_table (
id SERIAL PRIMARY KEY,
ref_id INT
);
-- 创建子表
CREATE TABLE child_table () INHERITS (parent_table);
-- 给父表添加外键约束
ALTER TABLE parent_table ADD CONSTRAINT fk_ref FOREIGN KEY (ref_id) REFERENCES referenced_table (id);
-- 结果:
parent_table 上的 ref_id 会被强制约束,必须引用 referenced_table 中的 id
child_table 不会继承此外键约束。子表中的 ref_id 列可以存储不符合外键约束的数据。
如何手动为子表添加外键约束?
如果需要对子表也应用相同的外键约束,必须手动为子表添加约束:
ALTER TABLE child_table ADD CONSTRAINT fk_ref_child FOREIGN KEY (ref_id) REFERENCES referenced_table (id);
-
检查约束(CHECK):子表会继承主表新增的检查约束。
ALTER TABLE parent_table ADD CONSTRAINT check_age CHECK (age > 0);
结果:
child_table
会自动继承check_age
。
4. 修改字段类型
-
行为:子表会自动继承主表字段类型的修改。
-
示例:
ALTER TABLE parent_table ALTER COLUMN name TYPE VARCHAR(50);
结果:
child_table
的name
字段类型会自动修改为VARCHAR(50)
。
5. 删除字段
-
行为:如果在主表中删除字段,子表的对应字段也会被删除。
-
示例:
ALTER TABLE parent_table DROP COLUMN age;
结果:
child_table
的age
字段也会被删除。
总结
主键、外键、唯一键约束以及创建索引不会继承
新增字段,删除字段,修改字段类型会继承
操作 | 是否继承到子表 | 备注 |
---|---|---|
新增字段 | 是 | 自动继承到子表 |
创建索引 | 否 | 需手动在子表创建 |
新增主键/唯一约束/外键约束 | 否 | 需手动在子表创建 |
新增检查约束 | 是 | 自动继承到子表 |
修改字段类型 | 是 | 自动继承到子表 |
删除字段 | 是 | 自动从子表删除 |