日期:2014-05-16  浏览次数:20446 次

向数据库插入数据后返回新插入行的主键

在开发的时候,大家可能也遇见过下面类似的问题。

场景说明:

存在表1,表2两张表,两表满足以下条件:

的主键为表2的外键

1的主键为自动编号,所以在插入数据时,会自增,无需人为干预

现在,想进行如下操作:

向表1插入1条新纪录,同时需要向表2插入多条新记录,表2中插入记录的外键为表1新插入记录的主键

问题解析:

因为表1的主键为自动编号,所以向表1插入新纪录的过程中,我们程序员是不知道表1新插入这条记录的主键的,因为这个往往不需要我们关注。但是向表2插入新记录时,这个主键又是必须要获取到的,那我们该怎么办呢

可以采用下面的方法:

NSERT INTO tableName (fieldname ...) values (value ...) SELECT @@IDENTITY AS returnName;  

 

具体实例:

创建表tb_Class及表tb_Studenttb_Class的主键为classid,自动编号。tb_Student的外键classidtb_Class表的主键classid对应。

CREATE TABLE [dbo].[tb_Class](
[classid] [int] IDENTITY(1,1) NOT NULL,
[classname] [nchar](10) NOT NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[tb_Student](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [nchar](10) NOT NULL,
[age] [int] NOT NULL,
[classid] [int] NULL,
CONSTRAINT [PK_tb_Student] PRIMARY KEY CLUSTERED 
(
[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

 

插入数据操作:

DECLARE @classId AS INT;
INSERT INTO tb_Class(classname) VALUES ('1班') SELECT @classId=@@IDENTITY;  
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana0',20,@classId);  
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana1',18,@classId);  
INSERT INTO tb_Student(name,age,classid) VALUES ('tiana2',21,@classId); 
SELECT * FROM tb_Class;
SELECT * FROM tb_Student;

 

插入两次后的结果为:

 

好了,88。