我有以下表格:
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的存在,所有参数的ID都存储在configuration_parameter中。我希望能够有一个参数列表(父参数,configuration_parameter中的参数),这些参数在parameter_varchar (或者其他的子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,configuration_parameter和id=12不应该出现。
要么我的陈述是错误的,要么我理解了某些继承错误的原则,并在DB本身中犯了一个错误。有人能解释一下我做错了什么,为什么出了问题吗?
发布于 2016-10-05 11:51:35
如果只想插入一行,则语句是错误的。
当一个表从另一个表继承时,它将继承这些列。您不能将行放在单独的表中。所以,你可以这么做:
INSERT INTO parameter_varchar(type, name, is_required, max_length)
SELECT 'varchar', 'APN Name', 'false', 32 ;
id
列是继承的,因此parameter_varchar
“知道”它是一个串行列。
发布于 2016-10-05 12:02:13
继承的使用会在新的子表和其父表之间创建持久关系。对父表的模式修改通常也会传播到子表,默认情况下子表的数据包含在父表的扫描中。
强调我的。如果不希望出现这种行为,那么使用like
代替inherits
,或者在select命令中使用only
:
select *
from only configuration_parameter
但是,如果父项有外键,则不需要继承。
https://stackoverflow.com/questions/39873047
复制相似问题