0

我有两张桌子,std_personal就像std_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

4 回答 4

2

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

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

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

于 2013-04-06T11:24:26.297 回答
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 调用来完成这三个步骤

这是存储的生产者

 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 
于 2013-04-06T11:29:01.240 回答
1

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

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

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

于 2013-04-06T11:53:25.113 回答
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');
于 2013-04-06T11:48:17.713 回答