如何在更改子表后更新父表上的行

时间:2015-12-31 09:31:55

标签: sql oracle

我有一个简单的DB,它有两个表,系列和季节。 意甲有这样的结构:

create table serie(
  name varchar2(30) not null,
  num_seasons number(2,0),
  launch date,
  constraint pk_serie primary key(name)
);

而季节有其他结构:

create table season(
  name_serie varchar2(30) not null,
  num_season number(2,0) not null,
  launch date not null,
  end date,
  constraint pk_season primary key(name_serie,num_season),
  constraint fk_season foreign key(name_serie) references serie(name),
  constraint check_time check(launch<end)
);

例如,对于有两个赛季的系列赛(num_seasons = 2),赛季表中会有两行,num_season = 1和num_season = 2。

我希望表格系列中的num_seasons列能够计算季节表中包含系列名称的行数。事实上,我希望该列依赖于季节表中的更改,如果您插入新的赛季,请将num_seasons值增加1。

感谢您的帮助:)

4 个答案:

答案 0 :(得分:0)

您可以使用子选择获得季节数。根本不需要将它存放在系列中。你可以为此做一个观点。

如果你仍然存储季节,存储季节数是多余的信息。除非出于特定的性能原因,否则应避免存储冗余信息。

SELECT
  s.name,
  ( SELECT count(*) 
    FROM season ss 
    WHERE ss.name_serie = s.name) as season_count
FROM
  serie s

答案 1 :(得分:0)

如果要插入表serie,请执行以下操作:

INSERT INTO serie (name,num_seasons,launch)
SELECT 
    name_serie
    ,COUNT(num_season)
    ,launch
FROM season
GROUP BY name_serie,launch
;

答案 2 :(得分:0)

您应该查看您的模型。

首先,您拥有serie表,其中主键是名称。这不是一个好主意,因为名称是文本,可以更改。更好的是将Id和名称设置为另一个字段。保持与系列赛有关的信息和季节赛季。

也许你需要的是另一张叫做剧集的桌子!

一个系列的顺序是由剧集组成的季节组成的。 如果你有很多关系,你需要添加关系表,如serie_season和season_episodes。然后你可以计算每个系列赛季和剧集的数量。

答案 3 :(得分:-1)

其他答案完全错误,因为他们告诉您使用select来执行插入,以检查一次存在多少季节(在插入时)。

季节表上的更新/删除会发生什么? 答案显而易见,你将使所有计数器都不对齐,数据将是不可用的。

为此,您必须修改serie表,特别是:

num_season NUMBER(2,0) DEFAULT 0

并在season表格上创建一些TRIGGER

  

触发器是存储在数据库中的过程   当事情发生时隐式运行或解雇。

     

传统上,触发器支持执行PL / SQL块   表或视图上发生INSERT,UPDATE或DELETE。触发器   在DATABASE和SCHEMA上支持系统和其他数据事件。神谕   数据库还支持执行PL / SQL或Java过程。

CREATE TRIGGER incSeasonNum AFTER INSERT ON season
FOR EACH ROW
BEGIN
  UPDATE serie SET num_seasons = num_seasons + 1 
  WHERE name = NEW.name_serie;
END

如果删除任何行,则另一个:

CREATE TRIGGER decSeasonNum AFTER DELETE ON season
FOR EACH ROW
BEGIN
  UPDATE serie SET num_seasons = num_seasons - 1 
  WHERE name = OLD.name_serie;
END

只是为了避免对系列名称或号码进行奇怪的更新:

CREATE TRIGGER incDecSeasonNum AFTER UPDATE ON season
FOR EACH ROW
BEGIN
  UPDATE serie SET num_seasons = num_seasons - 1 
  WHERE name = OLD.name_serie;
  UPDATE serie SET num_seasons = num_seasons + 1 
  WHERE name = NEW.name_serie;
END

希望得到这个帮助。