【发布时间】: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