2011-08-12 6 views
8

私は、学生テーブルと教師テーブルによって継承された人物テーブルを持っていると言います。私は学生INTO INSERTと教師INTO INSERTを行うと、例えば人テーブル(P_ID)の主キーを指定した場合プライマリキー制約が設定されているにもかかわらず、ベーステーブルの重複レコードが原因でSQLテーブル継承が発生する

私は私の人々のテーブルに2つの重複するレコードを巻く
INSERT INTO student(P_Id, LastName, FirstName, StudentNumber) 
VALUES (1, 'Jones', 'Casey', 'SID0001'); 

INSERT INTO teacher(P_Id, LastName, FirstName, FacultyNumber) 
VALUES (1, 'Jones', 'Casey', 'JONES0001'); 

(P_IDは私の主キーです人のテーブルで)、そのテーブルの制約を考慮せずに、サブテーブルが人のテーブルに挿入を行っているように見えます。 peopleテーブルの主キー制約が重複レコードの作成を妨げてはいけませんか?

人のテーブルに挿入される前に起動するトリガを使用してこの問題を解決すると考えましたが、既に存在するP_Idをチェックします。しかし私はそれが私にそのようなことをさせないようにするか、またはサブテーブルにレコードをインテリジェントに作成したいのですか

これを実行した後、生徒のテーブルに変更を加えて教師のテーブルに反映させますか?ここで

は、上記のINSERT文が唯一の私は、彼らが作成され、これらのテーブルでは動作しません理解例与えることだった文を作成されています

CREATE TABLE people 
(
people_id integer NOT NULL, 
last_name character varying NOT NULL, 
first_name character varying NOT NULL, 
middle_name character varying, 
gender character varying NOT NULL, 
date_of_birth date, 
ssn character varying, 
pref_language character varying, 
CONSTRAINT people_pkey PRIMARY KEY (people_id) 
) 

CREATE TABLE student 
(
-- Inherited from table people: people_id integer NOT NULL, 
-- Inherited from table people: last_name character varying NOT NULL, 
-- Inherited from table people: first_name character varying NOT NULL, 
-- Inherited from table people: middle_name character varying, 
-- Inherited from table people: gender character varying NOT NULL, 
-- Inherited from table people: date_of_birth date, 
-- Inherited from table people: ssn character varying, 
-- Inherited from table people: pref_language character varying, 
student_id integer NOT NULL, 
race character varying(80), 
ethnicity character varying(80), 
employer character varying(80), 
school character varying(80), 
pref_location character varying(80), 
CONSTRAINT student_pkey PRIMARY KEY (student_id) 
) 
INHERITS (people) 

CREATE TABLE teacher 
(
-- Inherited from table people: people_id integer NOT NULL, 
-- Inherited from table people: last_name character varying NOT NULL, 
-- Inherited from table people: first_name character varying NOT NULL, 
-- Inherited from table people: middle_name character varying, 
-- Inherited from table people: gender character varying NOT NULL, 
-- Inherited from table people: date_of_birth date, 
-- Inherited from table people: ssn character varying, 
-- Inherited from table people: pref_language character varying, 
teacher_id integer NOT NULL, 
user_name character varying NOT NULL, 
"password" character varying NOT NULL, 
title character varying, 
CONSTRAINT teacher_pkey PRIMARY KEY (teacher_id) 
) 
INHERITS (people) 
+0

CREATE文を投稿できますか? –

+0

あなたは 'student_id'と' student_id'をPRIMARY KEYSにする必要はなく、 'people.people_id'にはFOREIGN KEYSを持つ必要があると思います。 –

+0

ありがとうございます。 – SageMage

答えて

4

この動作は設計によるものだと思います。 PostgreSQL docsより。 。 。

INSERTは常に、指定されたテーブルに正確に挿入します。

さらに少し下にあります。 。 。

親テーブルのすべてのチェック制約とnot-null制約は、子によって自動的に継承されます。 です。その他のタイプの制約 (一意キー、主キー、および外部キー制約)は継承されません。

人のみから選択すると、行が表示されません。学生のみを選択すると、同じpeople_idの複数の行が表示されます。つまり、people_idと同じ値を持つ複数の行を学生に挿入することができます。これは逆に直感的です。ドキュメンテーションは壊れていると言いますが、おそらくいつか修正されるでしょう。

「警告」セクションのとおりです。 。 。

継承機能の重大な制限は、インデックス(ユニーク制約を含む) と外部キー制約だけではない彼らの相続の子どもたちに、単一のテーブルに を適用することです。 では、外部キー制約の参照側と参照側の両方に該当します。

同じセク​​ションです。

これらの欠陥は、おそらくいくつかの将来のリリースで修正されますが、その間かなりのケアの は 継承があなたの用途に有用であるかどうかを決定する際に必要とされています。

+1

主な洞察は、主キー制約がまったく違反されていないことです。 selectは、複数のテーブル、personsテーブル、studentsテーブル、およびteachersテーブルから行を戻します。この場合には、 'only'キーワードを使用してください。 – SingleNegationElimination

+0

@TokenMacGuy:人だけから選択すると、行が表示されません。学生のみを選択すると、同じpeople_idの複数の行が表示されます。つまり、people_idと同じ値を持つ複数の行を学生に挿入することができます。これは逆に直感的です。ドキュメンテーションは壊れていると言いますが、おそらくいつか修正されるでしょう。 –

+0

ええ、そうです。私はあなたに同意していた。外部のリンクやコメントに頼るのではなく、この情報の一部を回答に提供することは素晴らしいことです。 – SingleNegationElimination

1

をあなたの主キーフィールドのセットは、Identityですか?一意性を制約するには?

+0

申し訳ありませんが、あなたに何を聞いているのかわかりません。 – SageMage

+0

IDはOracleのPG SERIALです。しかし、Catcallの答えとPGドキュメントへの参照が正解です。 –

0

最初に子テーブルに挿入することはありません。 personテーブルは、挿入する必要のある最初のテーブルです。

+0

実際には、サブテーブルに最初に挿入すると、すべての継承された列がベーステーブルに挿入されると誤解されると思います。私はそれを試してみて、あなたが表示されますと信じていない場合は、ありがとう、) – SageMage

+0

@MattCase、いいえ、それはありません。 – ahanin

5

制約ルールは継承できないため、各テーブルで制約を定義する必要があります。例:

CREATE TABLE people (
    id int , 
    name varchar(20), 
    CONSTRAINT people_pkey PRIMARY KEY (id) 
); 

CREATE TABLE individual (
    cpf varchar(11), 
    CONSTRAINT individual_pkey PRIMARY KEY (id) 
) INHERITS (people); 


CREATE TABLE legal_entity (
    cnpj varchar(14), 
    CONSTRAINT legal_entity_pkey PRIMARY KEY (id) 
) INHERITS (people); 

関連する問題