Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 维护自定义自动增量列_Sql_Sql Server_Sql Server 2012_Sql Server 2014 - Fatal编程技术网

Sql 维护自定义自动增量列

Sql 维护自定义自动增量列,sql,sql-server,sql-server-2012,sql-server-2014,Sql,Sql Server,Sql Server 2012,Sql Server 2014,我有一个ID(identity)和XID(int)的表,这是我的自定义自动增量列。我使用了一个代替insert的触发器来维护XID,但是我得到了重复的触发器 表格 Info (LastId int) xtable(ID标识,XID int) 触发-代替插入 insert into [xtable] (XID) select [x].[NextavailableID] from inserted [i] cross apply ( select coalesce(max([t].[XID

我有一个ID(identity)和XID(int)的表,这是我的自定义自动增量列。我使用了一个代替insert的触发器来维护XID,但是我得到了重复的触发器


表格

Info (LastId int)
xtable(ID标识,XID int)


触发-代替插入

insert into [xtable] (XID)
select [x].[NextavailableID]
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) + 1 [NextavailableID]
  from [xtable] [t]
) [x];
declare @nextId int;

begin tran t1

  set @nextId = (select top 1 LastId from Info with (UPDLOCK, ROWLOCK)) + 1;

  update Info set LastId = nextId;

commit tran t1

insert into [xtable] (XID)
select @nextId
from inserted [i] 

假设已插入=1行


此触发器不阻止XID列中的重复。关于如何更改它有什么想法吗?

问题是,如果插入了多行,则所有行都使用相同的下一个可用ID,您需要在中添加
行号()
,以确保插入中的xid是唯一的:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];
关于防止重复,当获得最大值
xid
时,可以使用表提示锁定
xtable


使用这些锁的缺点是会导致死锁。此列上应具有唯一的约束/索引,因为这将防止重复,但在满足竞争条件时也会导致异常。最终,无论您选择何种方法,您都需要做出某种牺牲。

问题是,如果插入了多行,您将为所有行使用相同的下一个可用ID,您需要在中添加
行号()
,以确保插入中的xid是唯一的:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];
关于防止重复,当获得最大值
xid
时,可以使用表提示锁定
xtable


使用这些锁的缺点是会导致死锁。此列上应具有唯一的约束/索引,因为这将防止重复,但在满足竞争条件时也会导致异常。最终,无论您选择何种方法,您都需要做出某种牺牲。

问题是,如果插入了多行,您将为所有行使用相同的下一个可用ID,您需要在中添加
行号()
,以确保插入中的xid是唯一的:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];
关于防止重复,当获得最大值
xid
时,可以使用表提示锁定
xtable


使用这些锁的缺点是会导致死锁。此列上应具有唯一的约束/索引,因为这将防止重复,但在满足竞争条件时也会导致异常。最终,无论您选择何种方法,您都需要做出某种牺牲。

问题是,如果插入了多行,您将为所有行使用相同的下一个可用ID,您需要在中添加
行号()
,以确保插入中的xid是唯一的:

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];
关于防止重复,当获得最大值
xid
时,可以使用表提示锁定
xtable


使用这些锁的缺点是会导致死锁。此列上应具有唯一的约束/索引,因为这将防止重复,但在满足竞争条件时也会导致异常。最终,无论您选择哪种方法,都需要做出某种牺牲。

我最终创建了另一个表来存储最后的增量。在触发器中,在事务内部,我从带有提示的新表中选择(
UPDLOCK
ROWLOCK


表格

Info (LastId int)

触发-代替插入

insert into [xtable] (XID)
select [x].[NextavailableID]
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) + 1 [NextavailableID]
  from [xtable] [t]
) [x];
declare @nextId int;

begin tran t1

  set @nextId = (select top 1 LastId from Info with (UPDLOCK, ROWLOCK)) + 1;

  update Info set LastId = nextId;

commit tran t1

insert into [xtable] (XID)
select @nextId
from inserted [i] 


我最后创建了另一个表来存储最后一个增量。在触发器中,在事务内部,我从带有提示的新表中选择(
UPDLOCK
ROWLOCK


表格

Info (LastId int)

触发-代替插入

insert into [xtable] (XID)
select [x].[NextavailableID]
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) + 1 [NextavailableID]
  from [xtable] [t]
) [x];
declare @nextId int;

begin tran t1

  set @nextId = (select top 1 LastId from Info with (UPDLOCK, ROWLOCK)) + 1;

  update Info set LastId = nextId;

commit tran t1

insert into [xtable] (XID)
select @nextId
from inserted [i] 


我最后创建了另一个表来存储最后一个增量。在触发器中,在事务内部,我从带有提示的新表中选择(
UPDLOCK
ROWLOCK


表格

Info (LastId int)

触发-代替插入

insert into [xtable] (XID)
select [x].[NextavailableID]
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) + 1 [NextavailableID]
  from [xtable] [t]
) [x];
declare @nextId int;

begin tran t1

  set @nextId = (select top 1 LastId from Info with (UPDLOCK, ROWLOCK)) + 1;

  update Info set LastId = nextId;

commit tran t1

insert into [xtable] (XID)
select @nextId
from inserted [i] 


我最后创建了另一个表来存储最后一个增量。在触发器中,在事务内部,我从带有提示的新表中选择(
UPDLOCK
ROWLOCK


表格

Info (LastId int)

触发-代替插入

insert into [xtable] (XID)
select [x].[NextavailableID]
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) + 1 [NextavailableID]
  from [xtable] [t]
) [x];
declare @nextId int;

begin tran t1

  set @nextId = (select top 1 LastId from Info with (UPDLOCK, ROWLOCK)) + 1;

  update Info set LastId = nextId;

commit tran t1

insert into [xtable] (XID)
select @nextId
from inserted [i] 



为什么需要第二个自动递增列?这是一个简化的例子吗?可能有一个更容易维护的替代解决方案。@GarethD-这是一个简化的示例。每个公司都需要有一个唯一的ID。所以xtable也会有一个公司ID。哪个SQL Server?2008年[R2],2012年,2014年?@BogdanSahlean-我们正在使用的更新版本,但任何版本的解决方案都很好。为什么需要第二个自动增量列?这是一个简化的例子吗?可能有一个更容易维护的替代解决方案。@GarethD-这是一个简化的示例。每个公司都需要有一个唯一的ID。所以xtable也会有一个公司ID。哪个SQL Server?2008年[R2],2012年,2014年?@BogdanSahlean-我们正在使用的更新版本,但任何版本的解决方案都很好。为什么需要第二个自动增量列?这是一个简化的例子吗?可能有一个更容易维护的替代解决方案。@GarethD-这是一个简化的示例。每个公司都需要有一个唯一的ID。所以xtable也会有一个公司ID。哪个SQL Server?2008年[R2],2012年,2014年?@BogdanSahlean-我们正在使用的更新版本,但任何版本的解决方案都很好。为什么需要第二个自动增量列?这是一个简化的例子吗?可能有一个更容易维护的替代解决方案。@GarethD-这是一个简化的示例。每个公司都需要有一个唯一的ID。所以xtable也会有一个公司ID。哪个SQL Server?2008[R2],2012,2014?@BogdanSahlean-我们正在使用的更新版本,但任何版本的解决方案都很好。如果几个insert语句并行运行,这是否可行?抱歉