pin*_* af 12 postgresql database-design one-to-many table-relationships postgresql-9.6
我有三个表结构:tournament,group和team.所述tournament和group表具有一个一对多关系,group并team具有一个对多关系如下所示.
我如何复制的价值tournament_id,从group表到group_tournament_id的team表?
我正在寻找一个使用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即可
您应该直接使用引用teams来 tournaments.使用触发器自动从中获取相应的引用groups.(注意,引用不是必需的,因为您始终可以tournament_id从groups查询中获取.我假设此引用是为了简化某些查询).
我稍微修改了表和列的名称(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)
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |