将数据插入具有相同主键的多个表中

时间:2013-04-06 11:21:10

标签: php mysql sql database

我有两个表,std_personalstd_education,如下所示:

std_personal :
+----------------------+
| id |  name | family  |
+----------------------+

std_education :
+----------------------+ 
| related_std |  grade |
+----------------------+

std_education.related_std必须等于std_personal.id 如何使用1个查询在这两个不同的表中插入数据? 我的问题是,当我要插入std_personal.id时,std_education.related_std不存在 :)

4 个答案:

答案 0 :(得分:2)

您只能在只有一个查询的两个表中插入数据。

您必须先将数据添加到第一个表std_personal中,生成主键,然后使用此主键将数据插入第二个表std_education

您可能想要介绍外键概念。

答案 1 :(得分:1)

您应该使用存储过程或使用2个插入和1个选择命令。

首先

 insert into std_personal (id,name,family) values(1,'testname','testfamily')

第二

 select id from std_personal where name ='testname' and family ='testfamily'

第三

 insert into std_education (related_std ,grade) values(id_returned_from_db, 'A+')

或者编写一个存储过程,通过PHP的一次调用来执行这三个步骤

这是存储的procuder

 Create PROCEDURE [dbo].[TWO_INSERTS_WITH_ONE_WUERY]      
                                              (@name nvarchar(50),@surname nvarchar(50),@grade nvarchar(3))
 AS
 BEGIN

 declare @id int;

 insert into std_personal (id,name,family) values(1,@name,@surname)

 select @id=id from std_personal where name =@name and family =@surname

 insert into std_education (related_std ,grade) values(@id, @grade)


 END



 GO 

答案 2 :(得分:1)

查看您的架构,您只有一条个人数据,只有一条教育数据。通常,个人会有多个教育记录。考虑到这一点,您应该使用std_personal和std_education之间的一对多关系。如果你这样做,你应该

  • 开始交易
  • 插入std_personal
  • 获取主键
  • 使用个人主键作为外键插入std_education
  • 结束交易

如果发生任何错误,您将使用try catch块并回滚。

答案 3 :(得分:0)

你不能在一个查询中这样做,我不认为这是可能的,但你可以这样做吗,

首先将数据插入 std_personal

insert into std_personal (id,name,family) values(0,'name','family');

然后从表格 std_personal

中的最后一条记录中获取ID
select id from std_personal order by id desc  limit 1;

最后将数据插入std_education。

insert into std_education (related_std ,grade) values(id_from_select, 'grade');