Mysql 将自动递增主键插入外键表

Mysql 将自动递增主键插入外键表,mysql,database,Mysql,Database,我有两个表User和UserLogin。UserLogin与用户表具有外键关系。我想在这里做的是,每当我通过API将数据插入到用户表中时,它们的AutoGenerateUser_id就会自动插入到UserLogin表中 用户表: 用户登录表: 所以,当我运行查询在User表中添加name和email时,自动递增的User_id会自动插入到UserLogin表中,并带有提供的密码和号码。如何实现这一点以及线程是否安全?是的,这是可能的,并且通常可以通过@@identity获得。请尝试类似的操作

我有两个表User和UserLogin。UserLogin与用户表具有外键关系。我想在这里做的是,每当我通过API将数据插入到用户表中时,它们的AutoGenerateUser_id就会自动插入到UserLogin表中

用户表:

用户登录表:


所以,当我运行查询在User表中添加name和email时,自动递增的User_id会自动插入到UserLogin表中,并带有提供的密码和号码。如何实现这一点以及线程是否安全?

是的,这是可能的,并且通常可以通过@@identity获得。请尝试类似的操作

 set nocount off;
insert into User Values("Name","Email")
declare @lastID = @@identity
insert into UserLogin values(@lastID,"Password","number")
这段代码帮助你

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[User](
    [user_id] [int] IDENTITY(1,1) NOT NULL,
    [user_name] [varchar](100) NULL,
    [user_email] [varchar](100) NULL,
    [salt] [uniqueidentifier] NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [user_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]

GO
SET ANSI_PADDING OFF
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserLogin](
    [UserLoginId] [int] IDENTITY(1,1) NOT NULL,
    [user_id] [int] NULL,
    [user_password] [binary](1) NULL,
    [user_number] [int] NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[User]  WITH CHECK ADD  CONSTRAINT [FK_UserLogin_User] FOREIGN KEY([user_id])
REFERENCES [dbo].[User] ([user_id])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_UserLogin_User]
GO

 CREATE PROC [dbo].[Usp_UserLogin] 
 (
 @user_name VARCHAR(100)
 ,@user_email VARCHAR(100)
 ,@user_password VARCHAR(200)
 ,@user_number INT
 )

 AS
 Begin
  SET NOCOUNT ON 
 DECLARE @Salt UNIQUEIDENTIFIER =NEWID() 
        ,@IdentityNUmber INT
        ,@responseMessage nvarchar(1000)

 BEGIN TRY

        INSERT INTO Dbo.[User]([user_name],[user_email],[salt])

       SELECT        @user_name
                    ,@user_email
                    ,@salt



        SET @IdentityNUmber=SCOPE_IDENTITY()


        INSERT INTO Dbo.[UserLogin]([user_id],[user_password],user_number)

        SELECT  
         @IdentityNUmber
        ,@user_number 
        ,HASHBYTES('SHA2_512', @user_password + CAST(@salt AS NVARCHAR(36))) 



 END TRY

  BEGIN CATCH 
          SET @responseMessage=ERROR_MESSAGE() 
      END CATCH 



 END
GO
执行程序

EXEC [Usp_UserLogin] @user_name='Test1',@user_email='Test1@gmail',@user_password='Test1@123',@user_number=2

MySQL SQL Server。您实际使用的是什么?可能重复。使用范围\标识可能比使用@@IDENTITY更安全、更可靠。是范围更好,但我相信IDENT\u CURRENTtable name是最好的,它会将范围限制在特定的表中,而scope\u identity和@identity将检查生成的最大id是否存在差异。scope将作用于当前过程或tsql
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[User](
    [user_id] [int] IDENTITY(1,1) NOT NULL,
    [user_name] [varchar](100) NULL,
    [user_email] [varchar](100) NULL,
    [salt] [uniqueidentifier] NULL,
 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED 
(
    [user_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]

GO
SET ANSI_PADDING OFF
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserLogin](
    [UserLoginId] [int] IDENTITY(1,1) NOT NULL,
    [user_id] [int] NULL,
    [user_password] [binary](1) NULL,
    [user_number] [int] NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[User]  WITH CHECK ADD  CONSTRAINT [FK_UserLogin_User] FOREIGN KEY([user_id])
REFERENCES [dbo].[User] ([user_id])
GO
ALTER TABLE [dbo].[User] CHECK CONSTRAINT [FK_UserLogin_User]
GO

 CREATE PROC [dbo].[Usp_UserLogin] 
 (
 @user_name VARCHAR(100)
 ,@user_email VARCHAR(100)
 ,@user_password VARCHAR(200)
 ,@user_number INT
 )

 AS
 Begin
  SET NOCOUNT ON 
 DECLARE @Salt UNIQUEIDENTIFIER =NEWID() 
        ,@IdentityNUmber INT
        ,@responseMessage nvarchar(1000)

 BEGIN TRY

        INSERT INTO Dbo.[User]([user_name],[user_email],[salt])

       SELECT        @user_name
                    ,@user_email
                    ,@salt



        SET @IdentityNUmber=SCOPE_IDENTITY()


        INSERT INTO Dbo.[UserLogin]([user_id],[user_password],user_number)

        SELECT  
         @IdentityNUmber
        ,@user_number 
        ,HASHBYTES('SHA2_512', @user_password + CAST(@salt AS NVARCHAR(36))) 



 END TRY

  BEGIN CATCH 
          SET @responseMessage=ERROR_MESSAGE() 
      END CATCH 



 END
GO
EXEC [Usp_UserLogin] @user_name='Test1',@user_email='Test1@gmail',@user_password='Test1@123',@user_number=2