如何在一对多关系中复制另一个表的外键

pin*_* af 12 postgresql database-design one-to-many table-relationships postgresql-9.6

我有三个表结构:tournament,groupteam.所述tournamentgroup表具有一个一对多关系,groupteam具有一个对多关系如下所示.

表结构

我如何复制的价值tournament_id,从group表到group_tournament_idteam表?

我正在寻找一个使用create语句来实现这个目标的答案

create table team (
    id serial primary key, 
    group_id int references group, 
    group_tournament_id int references group(tournament_id)
);
Run Code Online (Sandbox Code Playgroud)

当然这不起作用,因为为了引用它必须是唯一的东西,在这种情况下,tournament_id不是唯一的

当我插入团队时,我需要一种标准的方法来将tournament_idfrom 的值复制group到'team'表中group_tournament_idgroup_id insidetable

编辑:不再需要在symfony中回答,只需postgreSQL即可

kli*_*lin 5

您应该直接使用引用teamstournaments.使用触发器自动从中获取相应的引用groups.(注意,引用不是必需的,因为您始终可以tournament_idgroups查询中获取.我假设此引用是为了简化某些查询).

我稍微修改了表和列的名称(group不能是表的名称).

表:

create table tournaments (
    tournament_id serial primary key);

create table groups (
    group_id serial primary key,
    tournament_id int references tournaments);

create table teams (
    team_id serial primary key, 
    group_id int references groups, 
    tournament_id int references tournaments);
Run Code Online (Sandbox Code Playgroud)

触发:

create or replace function before_insert_or_update_on_teams()
returns trigger language plpgsql as $$
begin
    new.tournament_id = (
        select tournament_id
        from groups
        where group_id = new.group_id
        limit 1);
    return new;
end $$;

create trigger before_insert_or_update_on_teams
before insert or update on teams
for each row execute procedure before_insert_or_update_on_teams();
Run Code Online (Sandbox Code Playgroud)

测试:

insert into tournaments values (default), (default);
insert into groups values (default, 2);
insert into teams values (default, 1, null);

select * from teams;

 team_id | group_id | tournament_id 
---------+----------+---------------
       1 |        1 |             2
(1 row)
Run Code Online (Sandbox Code Playgroud)