【问题标题】:Using SCOPE_IDENTITY() in a constraint在约束中使用 SCOPE_IDENTITY()
【发布时间】:2014-04-07 12:36:22
【问题描述】:

我知道使用IDENT_CURRENT 不会总是返回正确的标识值(尤其是在多线程应用程序中)。我想改用SCOPE_IDENTITY()

例如这是我的Employee 表:

create table Employee
(
    ID      int identity(1,1),
    Name    varchar(20),
    SystemID int,
    constraint Employee_PK primary key (ID asc)
)

我有以下声明:

alter table Employee 
  add constraint Employee_D1 default ident_current('Employee') for SystemID

我需要修改它以改用SCOPE_IDENTITY()

我尝试了以下方法:

alter table Employee 
  add constraint Employee_D1 default SCOPE_IDENITITY() for SystemID

这没有给出任何错误。但是在插入一行时,我没有看到该列使用标识值进行更新。我做错了什么?

请注意,SystemID 不能是只读的,因此计算字段不是一个选项。

我的练习是尝试消除在SystemID 中输入错误的IDENTITY 值,以防并行进程尝试插入行。

【问题讨论】:

  • 问题在于 ident_current 是否您使用它来预测下一个值,否则它应该是安全的,因为它为您提供了任何会话的最后一个身份值。 SCOPE_IDENTITY 仅适用于当前会话,我认为这就是您无法从中获得价值的原因。但我不确定你从这个限制中得到了什么好处?
  • 同意艾伦的观点 - 有一个默认值为 SCOPE_IDENTITY 的列有什么意义??如果您需要表中的唯一值 - 使用 INT IDENTITY 类型的列 - 但是第二列具有相同值有什么好处?如果你必须有这样的东西 - 你需要使用 ON INSERT 触发器....
  • 我很困惑 - ID 已经IDENTITY 列 - 您是否要确保 SystemID 始终等于 ID?或者到其他表格中的ID
  • 为什么您希望两列在同一个表中保存完全相同的数据?
  • SystemID 实际上会根据其他一些约束具有不同的值,否则存储 ID。我给出的示例只是一个简化版本,只关注我面临的问题,而不是业务规则。

标签: sql-server database identity identity-column


【解决方案1】:

只需重新阅读您的答案。 SystemID 不是标识列。我认为您不能使用 SCOPE_IDENITITY(),因为它没有添加行并在需要保存值时检索到新的 Identity 值。

您需要做的是在插入行之后创建一个触发器来更新 SystemId 值。 CREATE TRIGGER

【讨论】:

【解决方案2】:

这就是我解决这个问题的方法(对于糟糕的字段名称表示歉意,我感觉没有创造力)

CREATE TABLE employees (
   id               int identity(1,1) NOT NULL
 , name             varchar(20)       NOT NULL
 , actual_system_id int                   NULL
 , system_id As Coalesce(actual_system_id, id)
 , CONSTRAINT pk_employees PRIMARY KEY (id)
)
;

INSERT INTO employees (name)
  VALUES ('John')
       , ('Paul')
       , ('George')
       , ('Ringo')
;

SELECT id
     , name
     , system_id
FROM   employees
;

UPDATE employees
SET    actual_system_id = 937
WHERE  name = 'George'
;

SELECT id
     , name
     , system_id
FROM   employees
;

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多