首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL语句插入2行而不是1行。

SQL语句插入2行而不是1行。
EN

Stack Overflow用户
提问于 2016-10-05 11:42:52
回答 2查看 108关注 0票数 1

我有以下表格:

代码语言:javascript
运行
复制
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的行中的行相同。

这是我使用的语句:

代码语言:javascript
运行
复制
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本身中犯了一个错误。有人能解释一下我做错了什么,为什么出了问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-05 11:51:35

如果只想插入一行,则语句是错误的。

当一个表从另一个表继承时,它将继承这些列。您不能将行放在单独的表中。所以,你可以这么做:

代码语言:javascript
运行
复制
INSERT INTO parameter_varchar(type, name, is_required, max_length)
    SELECT 'varchar', 'APN Name', 'false', 32 ;

id列是继承的,因此parameter_varchar“知道”它是一个串行列。

票数 1
EN

Stack Overflow用户

发布于 2016-10-05 12:02:13

从手册上

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

强调我的。如果不希望出现这种行为,那么使用like代替inherits,或者在select命令中使用only

代码语言:javascript
运行
复制
select * 
from only configuration_parameter

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39873047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档