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