加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:25:35 所属栏目:百科 来源:网络整理
导读:我有三个表格结构:比赛,团队和团队.锦标赛和小组赛表有一对多的关系,团队和团队有一对多的关系,如下所示. 如何将组合表中的tournament_id的值复制到团队表的group_tournament_id中? 我正在寻找一个答案,这将使用create语句来实现这一点 create table team
我有三个表格结构:比赛,团队和团队.锦标赛和小组赛表有一对多的关系,团队和团队有一对多的关系,如下所示.

如何将组合表中的tournament_id的值复制到团队表的group_tournament_id中?

我正在寻找一个答案,这将使用create语句来实现这一点

create table team (
    id serial primary key,group_id int references group,group_tournament_id int references group(tournament_id)
);

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

我需要一个标准的方式来将组合中的tourn_id_id的值从组中复制到“team”表的group_tournament_id中,当我将group_id插入到团队表中

编辑:不再需要symfony的回答,只是postgreSQL会好的

您应该直接使用团队参与锦标赛的参考.使用触发器自动从组中获取适当的引用. (请注意,引用不是必需的,因为您可以随时从查询中的组中获取tournament_id.我认为此引用是为了简化某些查询).

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

表:

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);

触发:

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();

测试:

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读