zoukankan      html  css  js  c++  java
  • 向数据库插入数据后返回新插入行的主键

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

    场景说明:

    存在表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。

  • 相关阅读:
    shell脚本模拟交互操作实现上传文件至sftp
    从文件A中去除掉文件B的内容
    Linux批量kill某个程序的进程
    单数据盘或者很多数据盘mount挂载到某个目录
    用户HTTP请求过程简单剖析
    linux服务器系统盘坏且系统盘为软raid的修复方法
    linux系统运行状态检查
    TCP的三次握手和四次挥手
    ES6嵌套对象的解构
    DRF框架在嵌套关系下实现嵌套对象字段的过滤
  • 原文地址:https://www.cnblogs.com/riasky/p/3361041.html
Copyright © 2011-2022 走看看