0

私は俳優と人間の間に IS-A 関係を持っています。

PERSON の挿入ステートメントの書き方がわかりました。しかし、それを ACTOR に接続するにはどうすればよいでしょうか。

編集:明確にするために、関係を手動で設定する以外にこれを行う方法はありますか?

CREATE TABLE person
(
  person_id     INT,
  person_name   VARCHAR(20),
  birth_year    CHAR(4),
  gender        CHAR(1),
  PRIMARY KEY(person_id)
);

CREATE TABLE actor
(
  actor_id      INT NOT NULL REFERENCES person(person_id),
  PRIMARY KEY(actor_id)
);
4

3 に答える 3

2

それは、誰が俳優であるかをどのように判断するかによって異なります。person テーブルへの挿入時にこれがすでにわかっている場合は、別の INSERT ステートメントを使用して、その行をactor テーブルにも挿入できます。

すでに person テーブルが定義されていて、特定の人物を識別し、アクターとして (つまり名前で) タグ付けしたい場合は、次のようにすることができます。

INSERT INTO actor (actor_id) 
  SELECT person_id    
  FROM person
  WHERE person_name = 'Will Smith';

http://sqlfiddle.com/#!2/ce898/9

どちらの方法でも、actor の actor_id が有効な person_id と一致する限り、INSERT は有効です。対応する person_id が存在しない場合、INSERT は失敗します。

于 2012-05-11T02:59:38.983 に答える
2

Postgres を使用している場合は、OOP と同じように継承を行うことができます。

CREATE TABLE person
(
  person_id     serial primary key,
  person_name   VARCHAR(20),
  birth_year    CHAR(4),
  gender        CHAR(1)
);


create table actor
(
  role text
) inherits(person);

テスト:

insert into person(person_name,birth_year,gender)
values('john lennon','1940','M');


insert into actor(person_name,birth_year,gender,role)
values('johnny depp','19xx','M','hacker');


insert into actor(person_name,birth_year,gender,role)
values('johnny walker','19xx','M','walker');


select * from person order by person_name;

select * from actor order by person_name;


Output:


PERSON_ID   PERSON_NAME     BIRTH_YEAR  GENDER
1           john lennon     1940        M
2           johnny depp     19xx        M
3           johnny walker   19xx        M


PERSON_ID   PERSON_NAME     BIRTH_YEAR  GENDER  ROLE
2           johnny depp     19xx        M       hacker
3           johnny walker   19xx        M       walker

----------------------------------------------------------------


update actor set 
  role = 'pirates', birth_year = 1963
where person_name = 'johnny depp';

select * from person;

select * from actor;



Output:

PERSON_ID   PERSON_NAME     BIRTH_YEAR  GENDER
1           john lennon     1940        M
2           johnny depp     1963        M
3           johnny walker   19xx        M



PERSON_ID   PERSON_NAME     BIRTH_YEAR  GENDER  ROLE
2           johnny depp     1963        M       pirates
3           johnny walker   19xx        M       walker




----------------------------------------------------------------


delete from actor where person_name = 'johnny depp';

select * from person;

select * from actor;


Output:

PERSON_ID   PERSON_NAME     BIRTH_YEAR    GENDER
1           john lennon     1940          M
3           johnny walker   19xx          M

PERSON_ID   PERSON_NAME     BIRTH_YEAR    GENDER  ROLE
3           johnny walker   19xx          M       walker

ライブ テスト: http://www.sqlfiddle.com/#!1/463f4/1

于 2012-05-11T03:10:52.900 に答える
0

これを試してください

INSERT INTO ACTOR (ACTOR_ID) SELECT P.PERSON_ID FROM PERSON P LEFT P.PERSON_ID=A.ACTOR_ID で ACTOR A に参加

ありがとうラジャス

于 2012-05-11T04:57:46.670 に答える