Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否存在SQL表约束以确保两列之间存在关系?_Sql_Postgresql - Fatal编程技术网

是否存在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
列,因此不可能存在成员来自不同联盟的情况。

!谢谢!令人惊叹的!谢谢!