2017-10-10 100 views
-2

我有2個表UserUserLoginUserLoginUser表具有外鍵關係。我想要做的是每當我通過我的API將數據插入到用戶表中時,他們自動生成的(user_id)自動插入到UserLogin表中。將自動增量主鍵插入到外鍵表中

User表:

user_id | user_name | user_email 

UserLogin表:

user_id | user_password | user_number 

所以,當我跑我的查詢到User表,然後自動遞增user_id自動在UserLogin表所提供的插入添加的姓名和電子郵件密碼和號碼。我怎樣才能做到這一點,並確保線程安全?

+0

MySQL的<> SQL Server。你實際使用的是什麼。 –

+0

可能重複。 https://stackoverflow.com/questions/560783/the-equivalent-of-sqlserver-function-scope-identity-in-mysql –

回答

0

是的,它是可能的,通常可以通過@@ identity也optained嘗試像

set nocount off; 
insert into User Values("Name","Email") 
declare @lastID = @@identity 
insert into UserLogin values(@lastID,"Password","number") 
+0

SCOPE_IDENTITY()'可能比'@@ IDENTITY'更安全可靠。 。 https://docs.microsoft.com/en-us/sql/t-sql/functions/scope-identity-transact-sql –

+0

是範圍更好,但我beleive IDENT_CURRENT(「表名」)是最好的一個它會將範圍限制在特定的表中,而scope_identity和@@ identity將檢查具有差異範圍的最大生成的標識將範圍擴展到當前過程或tsql –

0

此代碼可以幫助你

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='[email protected]',@user_password='[email protected]',@user_number=2