我的下表如下:
League_id League_name Team_id Team_name
257 Copa America 11111 ABC
122 Brazil A 11111 ABC
135 La Liga 987 FC Barca
129 Copa Del Rey 987 *FC Barca Football
*Notice that there each team could play in different leagues
我想对Team_name
列进行健全检查,并确保Team_name
在所有联赛中都是相同的。即FC Barca Football
应标记,因为它与其他联盟中的FC Barca
不同。
进行此项检查的最佳方法是什么?
以下错误信息应该产生: 联盟的“Team_Name差异为Team_ID = 987”:西甲(135)和Copa Del Rey(129)
谢谢,
答案 0 :(得分:4)
解决此问题的适当方法是不在此表中存储team_name
。 team_name
列属于team
表(我假设team_id
是主键)。实际上,league_name
也不应该在此表中 - 它应该在league
表中league_id
是主键。
所以你真的需要三张桌子
CREATE TABLE league(
league_id NUMBER PRIMARY KEY,
league_name VARCHAR2(100) NOT NULL
);
CREATE TABLE team(
team_id NUMBER PRIMARY KEY,
team_name VARCHAR2(100) NOT NULL
);
CREATE TABLE team_league(
team_league_id NUMBER PRIMARY KEY,
team_id NUMBER REFERENCES team( team_id ),
league_id NUMBER REFERENCES league( league_id ),
CONSTRAINT uk_team_league UNIQUE( team_id, league_id )
);
然后,您可以创建一个视图,生成您在此处显示的数据
SELECT l.league_id, l.league_name,
t.team_id, t.team_name
FROM league l
JOIN team_league tl on (l.league_id = tl.league_id)
JOIN team t on (tl.team_id = t.team_id)
答案 1 :(得分:0)
您可以使用team_id和团队名称创建单独的表(团队)。对这些施加一个独特的约束。然后将League表与League_id,League_name,Team_id放在一起 因此,当您执行查询时,您可以从teams表中提取team_name,从而减少每个team_id允许多个团队名称的冗余。
答案 2 :(得分:0)
我建议你规范你的桌子。
换句话说:
使用 id 和团队名称列创建TEAM表。 使用 id 和联盟名称列创建LEAGUE表。
联盟可以包含许多团队,团队可以包含许多联盟。 因此,应将其建模为多对多关系。
即。 创建一个TEAM_LEAGUE表,其中包含联盟ID 和团队ID 字段
这种建模避免了这个问题,因为现在给定团队有一个独特的团队名称。