如何使用插入查询中的主键值自动设置非主键列的值?

时间:2014-02-24 12:33:11

标签: sql sql-server database rdbms

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

的表中插入新行

此表有3个字段:

  • ID :这是自动增量 int,它是我的 PRIMARY KEY

  • VulnerabilityAlertId :此字段为int且必须具有相同的值** Id

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

现在我的问题是如何做到这一点 VulnerabilityAlertId 具有与此新记录的* 自动增量 Id值相同的值。

如果我这样做:

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

它在表格中创建了一条新记录,其中未指定 Id 列值,因为它是自动增量, VulnerabilityAlertId 值为4

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

我该怎么办呢?

4 个答案:

答案 0 :(得分:1)

据我所知,您的问题是,您希望VulnerabilityAlertId值是否始终使用新行的Id列的值自动设置? 如果是,则应更改表定义并将VulnerabilityAlertId列添加为持久计算列:

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

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

希望这会有所帮助!!

答案 1 :(得分:1)

这就是我给这只猫皮肤的方式......

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

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

答案 2 :(得分:0)

有两种方式..

  1. 如果您可以将其拆分为多个语句,请在插入记录后使用@@ Identity更新最近插入的行。
  2. 或 2.利用下面内置的sql server函数。

    IDENT_CURRENT('table_name') + 1

答案 3 :(得分:-1)

如果要使用新创建的标识填充VulnerabilityID。

。然后您必须@@Idenity检索生成的最新标识,然后将其发送到 VulnerabilityiD 的插入声明

例如:

 declare @vulid int

insert into tablename(params) - >生成标识的正常插入语句

现在,使用

获取最新的身份

set @vulid=(select @@Identity) - >新生成的身份现在存储在此varaibale中

现在将其插入表中..

 updatetablename set vulnerabilityid=@vulid;

这将确保将最新生成的ID作为Vulnerabilityid

插入

希望这会有所帮助..