SQL语句插入2行而不是1

时间:2016-10-05 11:42:52

标签: sql postgresql

我有以下表格:

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本身中犯了错误。 有人可以解释一下我做错了什么以及为什么出错了?

2 个答案:

答案 0 :(得分:1)

如果您只想插入一行,那么您的陈述是错误的。

当一个表继承自另一个表时,它会继承列。您不能将行放入单独的表中。所以,你可以这样做:

INSERT INTO parameter_varchar(type, name, is_required, max_length)
    SELECT 'varchar', 'APN Name', 'false', 32 ;

id列是继承的,因此parameter_varchar"知道"这是一个连续的专栏。

答案 1 :(得分:0)

From the manual

  

使用INHERITS会在新子表与其父表之间创建持久关系。对父项的模式修改通常也会传播给子项,而默认情况下,子表的数据包含在父项的扫描中

强调我的。如果您不想要这种行为,请在select命令中使用like代替inherits或使用only

select * 
from only configuration_parameter

但如果父母有外键,则不需要继承。