如何将标识值插入到另一个表中



我有两个表:

create table Clients
(
     id_client int not null identity(1,1) Primary Key,
     name_client varchar(10) not null,
     phone_client int not null
)
create table Sales
(
     id_sale int not null identity(1,1) Primary Key,
     date_sale date not null, 
     total_sale float not null
     id_clients int not null identity(1,1) Foreign Key references Clients
)

因此,让我们在Clients('Ralph',00000000)中插入,id_client将为1(显然)。问题是:我如何将该1插入Sales?

F首先-您不能在任何表中有两列定义为identity-您将得到一个错误

消息2744,级别16,状态2,第1行
为表"Sales"指定了多个标识列。每个表只允许有一个标识列。

因此,您将无法实际创建Sales表。

Sales中的id_clients列引用了identity列,但就其本身而言,它应该而不是定义为标识,它可以获得客户端所具有的任何值。

create table Sales
(
     id_sale int not null identity(1,1) Primary Key,
     date_sale date not null, 
     total_sale float not null
     id_clients int not null foreign key references clients(id_client)
)
-- insert a new client - this will create an "id_client" for that entry
insert into dbo.Clients(name_client, phone_client)
values('John Doe', '+44 44 444 4444')
-- get that newly created "id_client" from the INSERT operation
declare @clientID INT = SCOPE_IDENTITY()
-- insert the new "id_client" into your sales table along with other values
insert into dbo.Sales(......, id_clients)
values( ......., @clientID)

这对我来说很有吸引力,因为据我所知,如果我从数据库的旧副本迁移用户或客户数据等,-标识列和用于为每一行赋予其唯一标识的UId(用户id)或CId(客户id)将变得不同步,因此我使用包含标识列值副本的第二列(TId/UId等)纯粹通过应用程序逻辑流关联我的数据。

当迁移发生时,我可以通过插入和删除伪数据将实际的SQL标识列(IdColumn因此,新客户或用户等将在用仍将包含第二列中的旧标识值的旧数据填充之后在新插入时继续从标识列中获取唯一值,使得其他表中的其他数据(事务等)仍将与客户/用户与所述数据相关的客户/用户同步,无论是事务还是其他什么。但不具有重复项,因为伪数据将向上推IdColumn值以匹配旧数据。

所以,如果我说920个用户记录,最大的UId是950,因为30个被删除了。然后,在添加旧的920条记录之前,我将在新表中伪插入和删除31行,以确保UId没有重复。它是非常拐弯抹角的,但它适用于我对SQL XD 的有限理解

这也让我可以在以后使用原始UId/CId/TId(身份副本)删除迁移的用户/客户/事务,并且不必担心如果我没有副本,并且目标是实际的身份列,那么如果数据是迁移的数据(从旧数据库插入数据库),则该列将不同步。拥有副本=快乐的日子。我可以使用(SET IDENTITY_INSERT[dbo].[UserTable]ON),但我最终可能会搞砸,所以这种方式对我来说是故障安全的。

本质上使数据实例在某种程度上不可知。

我使用插入的OUTPUT。IdColumn,然后在文件名中使用它保存任何相关的图片,并能够专门为图片查看器调用它们,而且数据也可以安全迁移。

要做到这一点,复制,特别是在插入时,效果非常好。

声明@userId INT=SCOPE_IDENTITY()以存储新的标识值UPDATE dbo。UserTable以选择在同一事务中更新所有事务的位置-SET UId=@userId将其设置为我的第二列-WHERE IdColumn=@userId;瞄准正确的行

USE [DatabaseName]
GO
/****** Object:  StoredProcedure [dbo].[spInsertNewUser]    Script Date: 
2022/02/04 12:09:19 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spInsertNewUser]
@Name varchar(50),
@PhoneNumber varchar(20),
@IDNumber varchar(50),
@Address varchar(200),
@Note varchar(400),
@UserPassword varchar(MAX),
@HideAccount int,
@UserType varchar(50),
@UserString varchar(MAX)

AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
INSERT INTO dbo.UserTable
    ([Name],
    [PhoneNumber],
    [IDNumber],
    [Address],
    [Note],
    [UserPassword],
    [HideAccount],
    [UserType],
    [IsDeleted],
    [UserString])
    OUTPUT inserted.IdColumn
VALUES
    (@Name,
    @PhoneNumber,
    @IDNumber,
    @Address,
    @Note,
    @UserPassword,
    @HideAccount,
    @UserType,
    @UserString);
    declare @userId INT = SCOPE_IDENTITY()
    
    UPDATE  dbo.UserTable
    SET     UId = @userId
    WHERE   IdColumn = @userId;
END

这是为测试的表创建的

CREATE TABLE [dbo].[UserTable](
[IdColumn] [int] IDENTITY(1,1) NOT NULL,
[UId] [int] NULL,
[Name] [varchar](50) NULL,
[PhoneNumber] [varchar](20) NULL,
[IDNumber] [varchar](50) NULL,
[Address] [varchar](200) NULL,
[Note] [varchar](400) NULL,
[UserPassword] [varchar](max) NULL,
[HideAccount] [int] NULL,
[UserType] [varchar](50) NULL,
[IsDeleted] [int] NULL,
[UserString] [varchar](max) NULL,
 CONSTRAINT [PK_UserTable] PRIMARY KEY CLUSTERED 
(
[IdColumn] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

相关内容

  • 没有找到相关文章

最新更新