在 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字段也会被删除。
总结
主键、外键、唯一键约束以及创建索引不会继承
新增字段,删除字段,修改字段类型会继承
| 操作 | 是否继承到子表 | 备注 |
|---|---|---|
| 新增字段 | 是 | 自动继承到子表 |
| 创建索引 | 否 | 需手动在子表创建 |
| 新增主键/唯一约束/外键约束 | 否 | 需手动在子表创建 |
| 新增检查约束 | 是 | 自动继承到子表 |
| 修改字段类型 | 是 | 自动继承到子表 |
| 删除字段 | 是 | 自动从子表删除 |
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




