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 JOIN ACTOR A ON P.PERSON_ID=A.ACTOR_ID

谢谢拉贾特

于 2012-05-11T04:57:46.670 回答