在SQL中避免两步插入

Cad*_*nge 2 sql t-sql database sql-server

假设我有一个表定义如下:

CREATE TABLE SomeTable
(
P_Id int PRIMARY KEY IDENTITY,
CompoundKey varchar(255) NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)

CompoundKey是一个字符串,其主键P_Id连接到末尾,如Foo00000001,它来自"Foo"+ 00000001.此时,插入此表的条目分两步进行.

  1. 为CompoundKey插入带有占位符字符串的虚拟记录.
  2. 使用生成的复合键更新CompoundKey.

我正在寻找一种方法来完全避免第二次更新,并使用一个insert语句完成所有操作.这可能吗?我正在使用MS SQL Server 2005.

ps我同意这不是世界上最明智的模式,这个模式将被重构(并正确规范化)但我现在无法对模式进行更改.

Chr*_*s J 5

你可以使用计算列; 将架构更改为:

CREATE TABLE SomeTable
(
P_Id int PRIMARY KEY IDENTITY,
CompoundKeyPrefix varchar(255) NOT NULL,
CompoundKey AS CompoundKeyPrefix + CAST(P_Id AS VARCHAR(10))
)
Run Code Online (Sandbox Code Playgroud)

这样,SQL Server将自动为您提供新列中的复合键,并自动为您维护它.您可能还希望查看PERSIST计算列的关键字,这将导致SQL Server实现数据文件中的值,而不是必须动态计算它.您也可以根据需要为列添加索引.

  • +1这可能是*最安全的方法,但实际上并没有消除`UPDATE`,它只是从用户那里抽象出来. (2认同)