我有两个表,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
不存在
:)
答案 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之间的一对多关系。如果你这样做,你应该
如果发生任何错误,您将使用try catch块并回滚。
答案 3 :(得分:0)
你不能在一个查询中这样做,我不认为这是可能的,但你可以这样做吗,
首先将数据插入 std_personal
insert into std_personal (id,name,family) values(0,'name','family');
然后从表格 std_personal
中的最后一条记录中获取IDselect id from std_personal order by id desc limit 1;
最后将数据插入std_education。
insert into std_education (related_std ,grade) values(id_from_select, 'grade');