Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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_Database_Postgresql_Database Design_Constraints - Fatal编程技术网

Sql 跨多个表的引用完整性

Sql 跨多个表的引用完整性,sql,database,postgresql,database-design,constraints,Sql,Database,Postgresql,Database Design,Constraints,确保进入表的任何数据与对应关系中的数据匹配的最简单方法是什么?在我的例子中,我有一个体育俱乐部。运动员可以在没有团队的情况下进行运动。我想强制要求运动员在加入球队之前进行这项运动 这是我的桌子: create table IF NOT EXISTS sports ( sport_id SERIAL, sport_name VARCHAR(50), PRIMARY KEY(sport_id) ); create table IF NOT EXISTS player

确保进入表的任何数据与对应关系中的数据匹配的最简单方法是什么?在我的例子中,我有一个体育俱乐部。运动员可以在没有团队的情况下进行运动。我想强制要求运动员在加入球队之前进行这项运动

这是我的桌子:

create table IF NOT EXISTS sports (
    sport_id SERIAL,
    sport_name VARCHAR(50),
    PRIMARY KEY(sport_id)
    );

create table IF NOT EXISTS players (
    player_id SERIAL,
    player_name VARCHAR(50),
    player_phone VARCHAR(20),
    PRIMARY KEY(player_id)
    );

create table IF NOT EXISTS players_sports (
    player_id INT REFERENCES players(player_id),
    sport_id int REFERENCES sports(sport_id),
    PRIMARY KEY (player_id, sport_id)
    );

create table IF NOT EXISTS teams (
    team_name VARCHAR(50),
    sport_id INT,
    captain_id INT,
    FOREIGN KEY (sport_id, captain_id) 
        REFERENCES players_sports(sport_id, player_id),
    PRIMARY KEY (team_name, sport_id)
    );

create table IF NOT EXISTS has_players (
    team_name VARCHAR(50),
    sport_id int,
    player_id INT REFERENCES players(player_id),
    FOREIGN KEY (team_name, sport_id) 
        REFERENCES teams(team_name, sport_id),
    PRIMARY KEY(team_name, sport_id, player_id)
    );

CREATE TYPE DAY AS ENUM (
  'Monday',
  'Tuesday',
  'Wednesday',
  'Thursday',
  'Friday',
  'Saturday',
  'Sunday'
);

create table IF NOT EXISTS time_slot (
    training_id SERIAL,
    training_day DAY,
    training_time TIME,
    team_name VARCHAR(50),
    sport_id int,
    FOREIGN KEY (team_name, sport_id) 
        REFERENCES teams (team_name, sport_id),
    PRIMARY KEY (training_id)
    );
我想强制要求运动员在加入球队之前进行这项运动

添加另一个类似以下内容:

CREATE TABLE IF NOT EXISTS has_players (
  team_name varchar(50)
, sport_id  int
, player_id int
, PRIMARY KEY(team_name, sport_id, player_id)
, FOREIGN KEY (team_name, sport_id)
    REFERENCES teams(team_name, sport_id)
, FOREIGN KEY (player_id, sport_id)
    REFERENCES players_sports(player_id, sport_id)
);
CREATE TABLE IF NOT EXISTS has\u players(
团队名称varchar(50)
,体育资讯中心
,player_id int
,主键(球队名称、运动id、球员id)
,外键(团队名称、运动id)
参考团队(团队名称、运动id)
,外键(球员id、运动id)
参考球员运动(球员id、运动id)
);

您可以在多个FK约束中包含同一列(如果这是阻止您这么做的原因)。

@MaxAtkins:简单就是它的美。:)