自动递增特定行

时间:2017-04-19 14:22:07

标签: sql sql-server increment

我需要增加一个名为Sequencia的列,每个Sequencia依赖于CedenteID,Ano和Periodo递增。这就是我使用的:

buf

但是,如果我同时执行它,这段代码允许我有重复的Sequencia。我想建议我应该做什么,而不是使用更新+1

我有什么:

  • CedenteID(PK / FK)
  • 肛(PK)
  • Periodo(PK)
char ses[8]; ltoa(s_id,ses,10)

如果符合以下条件我需要:

  • CedenteID = 392
  • Ano = 2016
  • Periodo = 2
select @Seq = isnull(Sequencia, 0) + 1
from T041_NossoNumero
where CedenteID = @CedenteID
and Ano = @Ano
and Periodo = @Periodo      

update T041_NossoNumero
set Sequencia = @Seq
where CedenteID = @CedenteID
and Ano = @Ano
and Periodo = @Periodo

3 个答案:

答案 0 :(得分:0)

自动"的唯一方法。按设计增加一列是使用这样的身份。

CREATE TABLE dbo.Table_1
    (
    sequence int NOT NULL IDENTITY (1, 1)
    )  ON [PRIMARY]

但是这对你不起作用,因为只有当所有其他字段都相同时才需要增加。
这意味着增量必须在应用程序端完成。
确保你使用执行此操作的单个事务,因为否则可能会出现同步问题。

答案 1 :(得分:0)

通过使用事务,您可以确保在并发调用中不会出现重复,但这可能会导致系统出现性能问题。

BEGIN TRY
    BEGIN TRANSACTION

    select @Seq = isnull(Sequencia, 0) + 1
    from T041_NossoNumero
    where CedenteID = @CedenteID
    and Ano = @Ano
    and Periodo = @Periodo      

    update T041_NossoNumero
    set Sequencia = @Seq
    where CedenteID = @CedenteID
    and Ano = @Ano
    and Periodo = @Periodo

    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
    THROW
END CATCH

答案 2 :(得分:0)

我可能遗漏了一些东西,但是你无法使用

UPDATE T041_NossoNumero
 set Sequencia = isnull(Sequencia, 0) + 1
 where CedenteID = @CedenteID
  and Ano = @Ano
  and Periodo = @Periodo