【问题标题】:How to automatically set the value of a not primary key column with the value of the primary key in an insert query?如何使用插入查询中的主键值自动设置非主键列的值?
【发布时间】:2014-03-26 02:57:57
【问题描述】:

我正在处理 INSERT 查询,该查询在名为 VulnerabilityAlertDocument

的表中插入新行

此表有 3 个字段:

  • Id:这是一个自动增量 int,它是我的PRIMARY KEY

  • VulnerabilityAlertId:此字段为 int,必须与 **Id 列的值相同

  • SourceId:是一个 varchar(50) 并包含一些文本。

现在我的问题是如何使 VulnerabilityAlertId 具有与此新记录的 *auto increment Id 值相同的值。

如果我这样做:

INSERT INTO VulnerabilityAlertDocument 
       ( [VulnerabilityAlertId], [SourceId] ) 
VALUES 
       (4, 'TEST');

它在表中创建一条新记录,其中 Id 列值未指定,因为它是自动递增的,并且 VulnerabilityAlertId 值为 4

我需要在此查询中,VulnerabilityAlertId 值自动设置为新行的 Id

我该怎么做?

【问题讨论】:

标签: sql sql-server database rdbms


【解决方案1】:

据我了解,您是否希望 VulnerabilityAlertId 值始终自动设置为新行的 Id 列的值? 如果是,那么您应该更改表定义并将VulnerabilityAlertId 列添加为持久计算列:

alter table VulnerabilityAlertDocument drop column VulnerabilityAlertId;
alter table VulnerabilityAlertDocument add VulnerabilityAlertId as id persisted;

通过这样做,无需指定VulnerabilityAlertId 列的值,因为每次插入新行时都会计算它。

希望这会有所帮助!

【讨论】:

  • 为什么不直接重命名 Id 列?
【解决方案2】:

这是我给这只猫剥皮的方法......

我会修改我的表定义(抱歉,现在想不出更好的字段名称):

CREATE TABLE your_table (
   Id                         int identity(1,1) NOT NULL
 , SourceId                   varchar(50)           NULL
 , ActualVulnerabilityAlertId int                   NULL
 , VulnerabilityAlertId As Coalesce(ActualVulnerabilityAlertId, Id)
);

基本上我已将VulnerabilityAlertId 更改为计算字段,并添加了一个新字段来保存“原始”数据。

然后您可以像这样填充表格:

INSERT INTO your_table (SourceId)
  VALUES ('TEST 1');

INSERT INTO your_table (SourceId)
  VALUES ('TEST 2');

INSERT INTO your_table (SourceId)
  VALUES ('TEST 3');

INSERT INTO your_table (SourceId, ActualVulnerabilityAlertId)
  VALUES ('TEST 4', 12345); -- Non-"default" value!

如果您需要更新一个值,那么您需要参考ActualVulnerabilityAlertId 字段:

UPDATE your_table
SET    ActualVulnerabilityAlertId = 937
WHERE  SourceId = 'TEST 2';

结果:

SELECT Id
     , SourceId
     , ActualVulnerabilityAlertId
     , VulnerabilityAlertId
FROM   your_table
ORDER
    BY Id;

Id SourceId VulnerabilityAlertId ActualVulnerabilityAlertId
-- -------- -------------------- --------------------------
1  TEST 1   1                    NULL
2  TEST 2   937                  937
3  TEST 3   3                    NULL
4  TEST 4   12345                12345

【讨论】:

    【解决方案3】:

    有两种方法..

    1. 如果您可以将其拆分为多个语句,请在插入记录后使用@@Identity 更新最近插入的行。

    或 2.利用下面内置的sql server函数。

    IDENT_CURRENT('table_name') + 1

    【讨论】:

      【解决方案4】:

      如果您想使用新创建的身份填充 VulnerabilityID。

      .那么您必须@@Idenity 来检索生成的最新身份,然后将其发送到VulnerabilityiD的插入语句

      例如:

       declare @vulid int
      

      insert into tablename(params) --> 生成身份的普通插入语句

      现在,获取使用

      创建的最新身份

      set @vulid=(select @@Identity) -> 新生成的身份现在存储在这个变量中

      立即将其插入表中..

       updatetablename set vulnerabilityid=@vulid;
      

      这将确保将最新生成的 id 作为 Vulnerabilityid 插入

      希望这会有所帮助..

      【讨论】:

      • 我认为他需要确保两个调用都在同一个事务中
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多