2

私は現在親テーブルを持っています:

CREATE TABLE members (
    member_id SERIAL NOT NULL, UNIQUE, PRIMARY KEY
    first_name varchar(20)
    last_name varchar(20)
    address address (composite type)
    contact_numbers varchar(11)[3]
    date_joined date
    type varchar(5)
);

および2つの関連テーブル:

CREATE TABLE basic_member (
    activities varchar[3]) // can only have 3 max activites
    INHERITS (members)
);

CREATE TABLE full_member ( 
    activities varchar[]) // can 0 to many activities
    INHERITS (members)
);

別のテーブルもあります:

CREATE TABLE planner (
        day varchar(9) FOREIGN KEY REFERENCES days(day)
        time varchar(5) FOREIGN KEY REFERENCES times(time)
        activity varchar(20) FOREIGN KEY REFERENCES activities(activity)
        member bigint FOREIGN KEY REFERENCES members(member_id)
);
ALTER TABLE planner ADD CONSTRAINT pk_planner PRIMARKY KEY (day,time,activity,member);

私は現在追加しようとしています

INSERT INTO planner VALUES ('monday','09:00','Weights',2);

私はfull_membersにセットを追加しました

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12,'Forest Road','Mansfield','Nottinghamshire','NG219DX'),'{01623485764,07789485763,01645586754}',20120418,'Full');

Plannerへの挿入が現在機能していません—理由を説明できますか?

4

4 に答える 4

2

現時点では、posgreSQL が継承と外部キーでうまく機能しないため、自分の質問に答えることができなかったので、ルールを作成しませんでした

CREATE RULE member_ref
AS ON INSERT TO planner
WHERE new.member NOT IN (SELECT member_id FROM members)
DO INSTEAD NOTHING;

これは基本的に外部キーと同じです

于 2012-04-21T11:24:57.653 に答える
1

これがより良い解決策になるかどうかはわかりませんが、ここに行きます...

原理は非常に単純です。

  • 新しいテーブルを作成してtable_with_pkeys、継承されたテーブルの主キー列を複製するそれを呼び出すことができますchild1, child2, child3...
  • 継承されたテーブルにトリガーを作成し、挿入後、table_with_pkeys新しく作成された PK に新しい PK を挿入し、変更された場合は更新後に更新し、削除後に table_with_pkeys から同じ PK を削除します。
  • 次に、FKを使用して親テーブルのPKを介してchild1、child2、またはいずれかを参照する必要があるすべてのテーブルで、そのFKを親のPKではなく、すべての子PKのコピーを持つtable_with_pkeysにポイントします。したがって、外部キーを持つ簡単な管理方法があります更新をカスケードしたり、更新を制限したりできます。

それが役に立てば幸い。

于 2012-09-18T08:14:31.930 に答える
0

アドレスの12の前にオープンクォートがありません:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'),
        '{01623485764,07789485763,01645586754}',20120418,'Full');

する必要があります:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', ('12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'),
        '{01623485764,07789485763,01645586754}',20120418,'Full');
于 2012-04-20T20:22:58.513 に答える
0

上記の具体化されたビューのアプローチがうまくいかない場合は、制約トリガーを作成して参照整合性を確認してください。残念ながら、現時点では、宣言的な参照整合性は継承ではうまく機能しません。

于 2012-09-24T07:05:21.210 に答える