如何创建带类型的子表?现有SQL方案报错,求可行替代方法
问题原因与解决办法
原SQL语句报错的核心原因是:PostgreSQL中使用CREATE TABLE ... OF创建的表,字段完全来自指定的自定义类型,但你同时让它继承myid表(带来id字段),还试图将不属于mypair类型的id设为主键,这会触发字段冲突与语法限制。
下面是两种可行的解决思路:
方案一:保留继承结构,复制类型字段
如果需要保留myid作为父表的继承关系,改用LIKE语法复制自定义类型的字段,再设置主键:
CREATE TABLE myid (id serial primary key); CREATE TYPE mypair AS (a int, b int); -- 复制mypair类型的所有字段,同时继承myid表 CREATE TABLE mypairs (LIKE mypair INCLUDING ALL) INHERITS (myid); -- 给继承来的id字段设置主键 ALTER TABLE mypairs ADD PRIMARY KEY (id);
方案二:将ID整合到自定义类型,无需继承
如果不需要继承结构,可以把id字段直接加入自定义类型,再创建表并指定主键:
-- 把id字段包含到自定义类型中 CREATE TYPE mypair AS (id int, a int, b int); -- 创建表时将id设为serial类型(自动生成序列)并设为主键 CREATE TABLE mypairs OF mypair ( id serial primary key );
或者手动管理序列(更灵活):
CREATE SEQUENCE myid_seq; CREATE TYPE mypair AS (id int, a int, b int); CREATE TABLE mypairs OF mypair ( id DEFAULT nextval('myid_seq'), PRIMARY KEY (id) ); -- 将序列与表字段关联,避免孤立序列 ALTER SEQUENCE myid_seq OWNED BY mypairs.id;
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

