-1

同じ家に住むことができるのは同じ家族の人だけである、人、家、家族を含むテーブルを作成したいと考えています。

ユニークな家族と家で1行しか投稿できないため、これまでのところうまくいきません。これを行う方法はありますか?

CREATE TABLE familyhouse (
  person VARCHAR(64),
  house VARCHAR(64),
  family VARCHAR(64),
  unique(house,family)
);

正しい表の例:

man,'1','1'
man2,'1','1'
man3,'1','1'
man4,'2','2'
man5,'2','2'
man6,'3','3'

正しくない表の例:

man,'1','1'
man2,'1','1'
man3,'1','2'
4

3 に答える 3

2

外部キーの力を利用して、家と家族をそれぞれのテーブル (family_house) と居住者用の別のテーブルに配置します。

CREATE TABLE family_house (
  house VARCHAR(128) NOT NULL UNIQUE,
  family VARCHAR(64) NOT NULL,
  PRIMARY KEY (house, family)
);

CREATE TABLE residents (
  person VARCHAR(64),
  house VARCHAR(128),
  family VARCHAR(64),
  UNIQUE (person, house, family),
  FOREIGN KEY (house, family) REFERENCES family_house
);

このようにして、同じ家に複数の居住者を持つことができますが、家には 1 つの家族しかいません。

于 2012-11-01T16:35:10.417 に答える
1

これを維持するためにCHECK CONSTRAINTを使用できます。

CREATE TABLE familyhouse (
  person VARCHAR(64),
  house VARCHAR(64),
  family VARCHAR(64)
);
CREATE FUNCTION CheckFamilyHouse(VARCHAR(64), VARCHAR(64))
RETURNS BOOLEAN AS $$
    SELECT CASE WHEN EXISTS 
                        (   SELECT  1
                            FROM    FamilyHouse
                            WHERE   Family = $1
                            AND     House != $2
                        )
                THEN false
                ELSE true
            END
$$ LANGUAGE SQL;

ALTER TABLE familyHouse 
ADD CONSTRAINT CHK_FamilyHouse
CHECK(CheckFamilyHouse(family, house));

上記を設定すると、以下の 2 番目の挿入は失敗します。

INSERT INTO familyhouse VALUES(1, 1, 1);
INSERT INTO FamilyHouse VALUES(2, 2, 1);

メッセージ付き:

ERROR: new row for relation "familyhouse" violates check constraint "chk_familyhouse": INSERT INTO FamilyHouse VALUES(2, 2, 1)

SQL フィドルの例

于 2012-11-01T16:43:15.780 に答える
0
create table house (
    id serial primary key
);

create table family (
    id serial primary key
);

create table house_family (
    house_id integer,
    family_id integer,
    primary key (house_id, family_id),
    foreign key (house_id) references house (id),
    foreign key (family_id) references family (id)
);

create table person (
    id serial primary key,
    family_id integer,
    house_id integer,
    foreign key (house_id, family_id) references house_family (house_id, family_id)
);

insert into house values (1),(2),(3);
insert into family values (1),(2),(3);
insert into house_family values (1,1),(2,2),(3,3);
insert into person (family_id, house_id) values (1,1),(1,1);

select * from house;
 id 
----
  1
  2
  3

select * from family;
 id 
----
  1
  2
  3

select * from house_family;
 house_id | family_id 
----------+-----------
        1 |         1
        2 |         2
        3 |         3

select * from person;
 id | family_id | house_id 
----+-----------+----------
  5 |         1 |        1
  6 |         1 |        1

同じ house_of family_id 1 に family_id 2 の人を挿入しようとすると、次のようになります。

insert into person (family_id, house_id) values (2,1);
ERROR:  insert or update on table "person" violates foreign key constraint "person_house_id_fkey"
DETAIL:  Key (house_id, family_id)=(1, 2) is not present in table "house_family".
于 2012-11-01T16:39:11.197 に答える