我有一个简单的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。
感谢您的帮助:)
答案 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
希望得到这个帮助。