Sql 如何从另一个表设置ID值
假设我有这些表格:Sql 如何从另一个表设置ID值,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有这些表格: CREATE TABLE [dbo].[Users] ( [User_ID] [int] IDENTITY(1,1)PRIMARY KEY NOT NULL , [LogIn] [varchar](100) NULL, [Pass] [varchar](100) NOT NULL, ) CREATE TABLE [dbo].[Consecutives] ( [Consecutives_ID] [int] IDENTITY(1,1) PRIM
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] IDENTITY(1,1)PRIMARY KEY NOT NULL ,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
)
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
)
我被要求能够设置编辑用户ID
,当使用连续
表中的值添加新用户时,下一步将使用该ID
因此,例如,如果连续的
值为50,即使最后添加的用户的用户ID
设置为8,新用户的ID将为50,连续的ID将更新为51
我会使用外键,但显然我不能将主键设置为外键
我找不到这样做的方法。有人能帮我吗 您是否尝试过设置标识插入?我可以帮你。要使用标识插入,用户需要一些alter table权限。您是否尝试过打开标识插入?我可以帮你。要使用标识插入,用户需要一些alter table权限。您所描述的称为一对一关系。
通过使用引用主键(或唯一索引)的外键连接两个表来创建这种关系。
但是,由于这是一对一的关系,实际上只有主表需要其主键上的
identity
规范
您要求根据连续
表中的现有记录向用户
插入记录,这对我来说似乎很奇怪。通常,当您具有一对一关系时,您会在同一事务中填充两个表中的相关记录
要创建一对一的关系,其中,concertives
是主表,DDL应该如下所示:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
请注意,我已经从User\u ID
列中删除了identity
规范,还更改了主键的声明方式,以便我可以手动命名它。命名约束是最佳实践,因为如果您需要更改它们,当您已经知道它们的名称时,它会简单得多 现在,要在同一事务中向两个表插入一条记录,可以创建如下存储过程:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
然后像这样执行它:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
(请注意,rextester不允许使用事务,因此try…catch和事务部分将从演示中删除)您所描述的是一对一关系。
通过使用引用主键(或唯一索引)的外键连接两个表来创建这种关系。
但是,由于这是一对一的关系,实际上只有主表需要其主键上的
identity
规范
您要求根据连续
表中的现有记录向用户
插入记录,这对我来说似乎很奇怪。通常,当您具有一对一关系时,您会在同一事务中填充两个表中的相关记录
要创建一对一的关系,其中,concertives
是主表,DDL应该如下所示:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
请注意,我已经从User\u ID
列中删除了identity
规范,还更改了主键的声明方式,以便我可以手动命名它。命名约束是最佳实践,因为如果您需要更改它们,当您已经知道它们的名称时,它会简单得多 现在,要在同一事务中向两个表插入一条记录,可以创建如下存储过程:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
然后像这样执行它:
CREATE TABLE [dbo].[Consecutives]
(
[Consecutives_ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[Value] [int] NOT NULL,
CONSTRAINT PK_Consecutives PRIMARY KEY (Consecutives_ID)
);
CREATE TABLE [dbo].[Users]
(
[User_ID] [int] NOT NULL,
[LogIn] [varchar](100) NULL,
[Pass] [varchar](100) NOT NULL,
CONSTRAINT PK_Users PRIMARY KEY (User_ID),
CONSTRAINT FK_Users_Consecutives FOREIGN KEY (User_ID) REFERENCES [dbo].[Consecutives]([Consecutives_ID])
);
CREATE PROCEDURE InsertUser
(
@Name varchar(100),
@Value int,
@LogIn varchar(100),
@Pass varchar(100)
)
AS
DECLARE @Consecutives AS TABLE
(
Id int
);
BEGIN TRY
BEGIN TRANSACTION
INSERT INTO [dbo].[Consecutives] ([Name], [Value])
OUTPUT Inserted.Consecutives_ID INTO @Consecutives
VALUES (@Name, @Value)
INSERT INTO [dbo].[Users] ([User_ID], [LogIn], [Pass])
SELECT Id, @Login, @Pass
FROM @Consecutives
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLL BACK TRANSACTION
END CATCH
GO
EXEC InsertUser 'Zohar Peled', 1, 'Zohar', 'Peled'
(请注意,rextester不允许使用事务,因此try…catch和事务部分将从演示中删除)因此
用户
和连续者
之间存在一对一的关系?为什么不为它们提供一个单独的表呢?我有其他表,这也适用(我只想有一个例子),因此,我需要能够在连续
表上具有不同的值注意,标识列无法更新-您可以将其留给sql server生成值,或使用set-identity insert on手动插入值,但是一旦行在表中,标识值就不能更改。因此用户
和连续项
之间有一对一的关系?为什么不为它们提供一个单独的表呢?我有其他表,这也适用(我只想有一个例子),因此,我需要能够在连续
表上具有不同的值注意,标识列无法更新-您可以将其留给sql server生成值或使用set-identity insert on手动插入值,但一旦该行位于表中,就无法更改标识值。谢谢!这正是我需要的!很高兴帮忙:-)谢谢!这正是我需要的!很乐意帮忙:-)