我有以下表格:
CREATE TABLE public.configuration_parameter
(
id SERIAL,
type parameter_type NOT NULL,
CONSTRAINT configuration_parameter_pk PRIMARY KEY (id)
);
CREATE TABLE public.parameter_varchar
(
-- Inherited from table configuration_parameter: id integer NOT NULL DEFAULT nextval('configuration_parameter_id_seq'::regclass),
-- Inherited from table configuration_parameter: type parameter_type NOT NULL,
configuration_parameter_id integer NOT NULL,
name character varying NOT NULL,
is_required boolean NOT NULL,
default_value character varying,
max_length integer,
CONSTRAINT parameter_varchar_pk PRIMARY KEY (configuration_parameter_id),
CONSTRAINT configuration_parameter_varchar_fk FOREIGN KEY (configuration_parameter_id)
REFERENCES public.configuration_parameter (id) MATCH SIMPLE
ON UPDATE RESTRICT ON DELETE RESTRICT
)
INHERITS (public.configuration_parameter);
如您所见,parameter_varchar继承自configuration_parameter。 所有参数的ID都存储在configuration_parameter中,以避免双参数ID。我希望能够有一个参数列表(父,configuration_parameter中的参数),这些参数列表在其中一个子参数中进一步指定,如parameter_varchar(或其他子参数_整数和其他子参数)。
现在我想添加一个参数。我的想法是首先向父表(configuration_parameter)添加一行,然后在子行(parameter_varchar)中添加一行以进一步指定参数。 configuration_parameter_ID必须与添加到configuration_parameter的行相同。
这是我使用的陈述:
with inserted as (
INSERT INTO configuration_parameter(type)
VALUES ('varchar') RETURNING id
)
INSERT INTO parameter_varchar(type, configuration_parameter_id, name, is_required, max_length)
select 'varchar', inserted.id, 'APN Name', 'false', 32 from inserted;
现在发生的事情是,parameter_varchar中有一行包含我指定的所有内容,其中id = 12,configuration_parameter_id = 11。 但是在configuration_parameter中有2行添加了id = 11和id = 12。 id = 12的configuration_parameter不应该存在。
我的陈述是错误的,或者我理解某些继承原则是错误的并且在DB本身中犯了错误。 有人可以解释一下我做错了什么以及为什么出错了?
答案 0 :(得分:1)
如果您只想插入一行,那么您的陈述是错误的。
当一个表继承自另一个表时,它会继承列。您不能将行放入单独的表中。所以,你可以这样做:
INSERT INTO parameter_varchar(type, name, is_required, max_length)
SELECT 'varchar', 'APN Name', 'false', 32 ;
id
列是继承的,因此parameter_varchar
"知道"这是一个连续的专栏。
答案 1 :(得分:0)
使用INHERITS会在新子表与其父表之间创建持久关系。对父项的模式修改通常也会传播给子项,而默认情况下,子表的数据包含在父项的扫描中
强调我的。如果您不想要这种行为,请在select命令中使用like
代替inherits
或使用only
:
select *
from only configuration_parameter
但如果父母有外键,则不需要继承。