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手动插入值,但一旦该行位于表中,就无法更改标识值。谢谢!这正是我需要的!很高兴帮忙:-)谢谢!这正是我需要的!很乐意帮忙:-)