2016-10-05 6 views
1

私は以下の表を持っているが挿入されます。 すべてのパラメータのIDは、二重パラメータIDを避けるために、configuration_parameterに格納されます。私は、parameter_varchar(または他の子parameter_integerなど)のような子の1つでさらに指定されているパラメータのリスト(親のもの、configuration_parameter)を持つことができるようにしたい。SQLステートメントが2行の代わりに、1

ここでパラメータを追加します。私の考えは、最初に親テーブル(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; 

されており、1行にid = 12とconfiguration_parameter_id = 11で、私は指定されたすべてのものとparameter_varcharであり、今何が起こります。 しかし、configuration_parameterには、id = 11とid = 12で2行追加されています。 id = 12のconfiguration_parameterは存在してはいけません。

私の声明が間違っているか、継承の原則が間違っていて、DB自体に間違いがありました。 誰かが私が間違っていたこととそれがなぜ間違っていたのか説明してもらえますか?

答えて

1

1つの行だけを挿入する場合は、文が間違っています。

あるテーブルが別のテーブルを継承すると、そのテーブルを継承します。行を別のテーブルに入れないでください。だから、あなただけ行うことができます。

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

id列が継承されているので、parameter_varcharは、それがシリアル列であることを「知っています」。

+0

これはエラーをスローします。エラー: "configuration_parameter_id"列のnull値がnullでない制約に違反しています – Kailayla

+2

@Kailaylaは答えが少し不足しています。あなたのddlは間違っています。あなたは継承または関連しています(外部キー)。両方を行うことはできません。私はあなたが継承を削除することをお勧めします。さらに読む[docs](https://www.postgresql.org/docs/current/static/ddl-inherit.html) –

+0

@Aツ彼は両方を行うことができます。それは間違っているわけではないが、彼の場合は意味をなさない。 –

0

From the manual

Use of INHERITS creates a persistent relationship between the new child table and its parent table(s). Schema modifications to the parent(s) normally propagate to children as well, and by default the data of the child table is included in scans of the parent(s)

重点鉱山。あなたがその振る舞いをしたくない場合は、代わりのinheritslikeを使用するか、選択コマンドでonlyを使用します。

select * 
from only configuration_parameter 

しかし、親への外部キーがある場合、あなたは、継承を必要としません。

関連する問題