在 mysql 中插入值以更新外键
insert value to update foreign key in mysql
对不起这个标题。只是我不知道如何提出这个疑问,所以就努力实现我的目标吧。
我有两个表:玩家和团队。我的疑问是如何添加 5 个播放器,使用
关系 one-to-many 就像一个 5 人的团队,我试着更新
团队中的玩家 ID,但它只是 return 最后一个玩家 ID。
create table if not exists player (
p_id int auto_increment not null,
p_name varchar(100) not null,
p_number int not null,
primary key (p_id)
);
create table if not exists team (
t_id int not null auto_increment,
t_name varchar(100) not null,
t_player_id int null,
primary key (t_id)
);
alter table team add constraint t_pk_player foreign key (t_player_id)
references player(p_id) on delete cascade;
stored prodecure
创建 player
和 return id
DELIMITER $$
create procedure sp_create_player(in newName varchar(100),
in newNumber int,
out id_player int)
begin
insert into player (p_name, p_number) values (newName, newNumber);
-- get the id of player
set id_player := last_insert_id();
end$$
DELIMITER ;
stored prodecure
创建 team
和 return id
DELIMITER $$
create procedure sp_create_team(in newName varchar(100), out id_team int)
begin
insert into team (t_name) values (newName);
-- get the id of teams
set id_team := last_insert_id();
end$$
DELIMITER ;
我怀疑他在这个 stored prodecure
到 add player
到 team
DELIMITER $$
create procedure sp_add_player_in_team(in teamId int, in playerId int)
begin
-- I tried to make set but it´s not work
update team set t_player_id = playerId where t_id = teamId;
end$$
DELIMITER ;
测试stored procedure
-- 5 player
call sp_create_player('De Gea', 1, @id_player1);
call sp_create_player('Rojo', 2, @id_player2);
call sp_create_player('Pogba', 3, @id_player3);
call sp_create_player('Rashford', 4, @id_player4);
call sp_create_player('Ibrahimovic', 5, @id_player5);
-- 1 team
call sp_create_team('Manchester United', @id_team);
-- select all player and team
SELECT * FROM player;
SELECT * FROM team;
-- add 5 player to team
call sp_add_player_in_team(@id_team, @id_player1);
call sp_add_player_in_team(@id_team, @id_player2);
call sp_add_player_in_team(@id_team, @id_player3);
call sp_add_player_in_team(@id_team, @id_player4);
call sp_add_player_in_team(@id_team, @id_player5);
-- select all player in team
SELECT t_player_id FROM team WHERE t_id = @id_team;
有什么建议吗?
您可能是在倒退或过于简单地表述这种关系。如果球员属于一个球队,并且只有一个球队,球员记录应该参考球队记录。
如果玩家可以在多个团队中,那么您将拥有多对多关系;这需要额外的 table 将玩家链接到他们所在的团队(因此团队与他们所在的玩家)。
您可能希望球队直接引用球员的唯一情况是,如果您使用这样的参考来指定球队 "captain" 或类似的东西,其中只有一个球员团队。如果您允许联合队长,或者想指定一名球员在该球队中的角色,那么作为链接 table.
上的一列可能会更好
对不起这个标题。只是我不知道如何提出这个疑问,所以就努力实现我的目标吧。
我有两个表:玩家和团队。我的疑问是如何添加 5 个播放器,使用 关系 one-to-many 就像一个 5 人的团队,我试着更新 团队中的玩家 ID,但它只是 return 最后一个玩家 ID。
create table if not exists player (
p_id int auto_increment not null,
p_name varchar(100) not null,
p_number int not null,
primary key (p_id)
);
create table if not exists team (
t_id int not null auto_increment,
t_name varchar(100) not null,
t_player_id int null,
primary key (t_id)
);
alter table team add constraint t_pk_player foreign key (t_player_id)
references player(p_id) on delete cascade;
stored prodecure
创建 player
和 return id
DELIMITER $$
create procedure sp_create_player(in newName varchar(100),
in newNumber int,
out id_player int)
begin
insert into player (p_name, p_number) values (newName, newNumber);
-- get the id of player
set id_player := last_insert_id();
end$$
DELIMITER ;
stored prodecure
创建 team
和 return id
DELIMITER $$
create procedure sp_create_team(in newName varchar(100), out id_team int)
begin
insert into team (t_name) values (newName);
-- get the id of teams
set id_team := last_insert_id();
end$$
DELIMITER ;
我怀疑他在这个 stored prodecure
到 add player
到 team
DELIMITER $$
create procedure sp_add_player_in_team(in teamId int, in playerId int)
begin
-- I tried to make set but it´s not work
update team set t_player_id = playerId where t_id = teamId;
end$$
DELIMITER ;
测试stored procedure
-- 5 player
call sp_create_player('De Gea', 1, @id_player1);
call sp_create_player('Rojo', 2, @id_player2);
call sp_create_player('Pogba', 3, @id_player3);
call sp_create_player('Rashford', 4, @id_player4);
call sp_create_player('Ibrahimovic', 5, @id_player5);
-- 1 team
call sp_create_team('Manchester United', @id_team);
-- select all player and team
SELECT * FROM player;
SELECT * FROM team;
-- add 5 player to team
call sp_add_player_in_team(@id_team, @id_player1);
call sp_add_player_in_team(@id_team, @id_player2);
call sp_add_player_in_team(@id_team, @id_player3);
call sp_add_player_in_team(@id_team, @id_player4);
call sp_add_player_in_team(@id_team, @id_player5);
-- select all player in team
SELECT t_player_id FROM team WHERE t_id = @id_team;
有什么建议吗?
您可能是在倒退或过于简单地表述这种关系。如果球员属于一个球队,并且只有一个球队,球员记录应该参考球队记录。
如果玩家可以在多个团队中,那么您将拥有多对多关系;这需要额外的 table 将玩家链接到他们所在的团队(因此团队与他们所在的玩家)。
您可能希望球队直接引用球员的唯一情况是,如果您使用这样的参考来指定球队 "captain" 或类似的东西,其中只有一个球员团队。如果您允许联合队长,或者想指定一名球员在该球队中的角色,那么作为链接 table.
上的一列可能会更好