是否存在SQL表约束以确保两列之间存在关系?
我正在努力解决以下问题是否存在SQL表约束以确保两列之间存在关系?,sql,postgresql,Sql,Postgresql,我正在努力解决以下问题 CREATE TABLE leagues ( id SERIAL PRIMARY KEY, name TEXT, ... ); CREATE TABLE players ( id SERIAL PRIMARY KEY, first_name TEXT, last_name TEXT, ... ); CREATE TABLE league_members ( league_id INTEGER REFERE
CREATE TABLE leagues (
id SERIAL PRIMARY KEY,
name TEXT,
...
);
CREATE TABLE players (
id SERIAL PRIMARY KEY,
first_name TEXT,
last_name TEXT,
...
);
CREATE TABLE league_members (
league_id INTEGER REFERENCES leagues (id),
player_id INTEGER REFERENCES players (id),
PRIMARY KEY (league_id, player_id)
);
CREATE TABLE games (
id SERIAL PRIMARY KEY,
league_id INTEGER REFERENCES leagues (id),
winner INTEGER REFERENCES players (id),
loser INTEGER REFERENCES players (id)
);
在游戏表中,我是否可以使用约束来检查赢家和输家是否都是同一联盟的成员
例如:
玩家表:
---- id ---- first_name ----
1 "John"
2 "Joe"
3 "Jill"
---- id ---- league_id ---- player_id ----
1 1 1
2 1 2
3 2 3
SELECT count(*) FROM league_members WHERE league_id = 1 AND (player_id = 1 OR player_id = 3);
联赛表:
---- id ---- name ----
1 "League 1"
2 "League 2"
联盟成员表:
---- id ---- first_name ----
1 "John"
2 "Joe"
3 "Jill"
---- id ---- league_id ---- player_id ----
1 1 1
2 1 2
3 2 3
SELECT count(*) FROM league_members WHERE league_id = 1 AND (player_id = 1 OR player_id = 3);
我希望确保在游戏表中,以下内容会导致错误:
INSERT INTO games (league_id, winner, loser) VALUES (1,1,3);
这是不允许的,因为球员3不在一级联赛。现在我只是在league_members表上运行以下查询:
---- id ---- first_name ----
1 "John"
2 "Joe"
3 "Jill"
---- id ---- league_id ---- player_id ----
1 1 1
2 1 2
3 2 3
SELECT count(*) FROM league_members WHERE league_id = 1 AND (player_id = 1 OR player_id = 3);
他们确保计数为2,这意味着两名球员都是联盟中id为1的成员。如果计数为2,则我允许插入到games表中,否则不允许。有没有办法做到这一点,但让数据库处理约束,这样我就不必在尝试插入到games表之前进行额外的查询
谢谢 几个外键应该可以让事情保持正常:
CREATE TABLE games (
id SERIAL PRIMARY KEY,
league_id INTEGER REFERENCES leagues (id),
winner INTEGER REFERENCES players (id),
loser INTEGER REFERENCES players (id),
constraint FK_League_Winner FOREIGN KEY (league_id,winner)
REFERENCES league_members (league_id,player_id),
constraint FK_League_Loser FOREIGN KEY (league_id,loser)
REFERENCES league_members (league_id,player_id)
);
由于这两个键都共享此表中的
league\u id
列,因此不可能出现成员来自不同联盟的情况。两个外键应该可以使事情保持正常:
CREATE TABLE games (
id SERIAL PRIMARY KEY,
league_id INTEGER REFERENCES leagues (id),
winner INTEGER REFERENCES players (id),
loser INTEGER REFERENCES players (id),
constraint FK_League_Winner FOREIGN KEY (league_id,winner)
REFERENCES league_members (league_id,player_id),
constraint FK_League_Loser FOREIGN KEY (league_id,loser)
REFERENCES league_members (league_id,player_id)
);
由于这两个键都共享此表中的
league\u id
列,因此不可能存在成员来自不同联盟的情况。!谢谢!令人惊叹的!谢谢!