none
Identify incrementando errado SQL Server 2008 R2 RRS feed

  • Pergunta

  • Olá, se alguém puder ajudar, estou com problema ao utilizar identify com seed 1 e increment 1.

    Criei a tabelada seguinte maneira:

    CREATE TABLE [dbo].[lotesms] (
      [id] int IDENTITY(1, 1) NOT NULL,
      [teste] varchar(1) COLLATE Latin1_General_CI_AS NULL
    )
    ON [PRIMARY]
    GO

    e estou fazendo um insert desse modo:

    insert into LOTESMS(teste) values ('1')
    go

    e sempre incrementa 2 números. Por exemplo:

    ID 2 teste 1

    ID 4 teste 1

    ID 6 teste 1

    Já criei nova tabela, já mudei valor de seed e nada.

    se alguém souber, agradeço.

    quarta-feira, 22 de agosto de 2012 14:39

Respostas

  • Consegui resolver em partes.

    Fiz os insert's através do SQL Server Management Studio e foi de boa.

    incrementou só 1.

    E através do SQL Manager Lite for Sql Server 3.8.0.2

    incrementa 2 ou 3, conforme o banco.

    Pode ser configuração, ou bug mesmo. Mas agradeço a todos que me ajudaram.

    • Marcado como Resposta Luis Olivetti quarta-feira, 22 de agosto de 2012 18:33
    quarta-feira, 22 de agosto de 2012 18:17

Todas as Respostas

  • Sua sintaxe está certinha,

    dropa essa tabela e cria denovo,

    IF EXISTS (SELECT 1 FROM sys.tables WHERE name='lotesms')
    	DROP TABLE LOTESMS
    	
    GO
    
    CREATE TABLE [dbo].[lotesms] (
      [id] int IDENTITY(1, 1) NOT NULL,
      [teste] varchar(1) COLLATE Latin1_General_CI_AS NULL
    )
    ON [PRIMARY]
    GO
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    
    GO
    
    select * from lotesms

    [ ] ' s

    quarta-feira, 22 de agosto de 2012 14:44
  • Tem algum tipo de trigger nesta tabela?

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 14:47
    Moderador
  • Fernando, rodei esse script que você passou e realmente funciona, mas se rodo novamente o insert com esse mesmos valores, ele pula o id. Exemplo que ocorreu agora:

    id 37 teste 1

    id 38 teste 2

    id 41 teste 1

    id 42 teste 2

    Pelos testes que fiz, quando não faço insert seuido de outro insert, ele pula dois números

    quarta-feira, 22 de agosto de 2012 14:59
  • Não tem trigger roberson
    quarta-feira, 22 de agosto de 2012 15:00
  • Tire print do resultado

    id 37 teste 1
    id 38 teste 2
    id 41 teste 1
    id 42 teste 2

    para mim por favor.


    quarta-feira, 22 de agosto de 2012 15:12
  • Fiz um delete from lotesms e rodei duas vezes esse insert:

    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')

    quarta-feira, 22 de agosto de 2012 16:29
  • Muito estranho. Isso acontece em qualquer tabela que tenha Identity? Ou seja, se você criar uma outra tabela que não tenha nada a ver com essa também acontecerá o problema?

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 16:42
    Moderador
  • Qualquer tabela que tenha identify acontece isso
    quarta-feira, 22 de agosto de 2012 16:57
  • Mas se você efetuou o comando delete a sequencia de identity está certo, exemplo registro teste 50 o seu campo identity era = 50, logo depois que você deleta esse registro e faz uma nova inserção, o SQL SERVER não garante para você que essa sequência não será quebrada, na verdade como sua transação já utilizou esse ID anteriormente ele pula para o seguinte.
    quarta-feira, 22 de agosto de 2012 17:03
  • Não fernando, me expressei errado, eu fiz um delete em tudo

    Pode ver no log o que eu realizei

    select * from lotesms
    GO
    
    /* Result : "6 row(s) returned
    (0 ms)" */
    
    
    
    /*------ 22/08/2012 13:26:04 --------*/
    
    delete from lotesms
    GO
    
    /* Result : "6 row(s) affected
    (15 ms)" */
    
    
    
    /*------ 22/08/2012 13:26:12 --------*/
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    GO
    
    /* Result : "1 row(s) affected
    1 row(s) affected
    (16 ms)" */
    
    
    
    /*------ 22/08/2012 13:26:16 --------*/
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    GO
    
    /* Result : "1 row(s) affected
    1 row(s) affected
    (16 ms)" */
    
    
    
    /*------ 22/08/2012 13:26:19 --------*/
    
    select * from lotesms
    GO
    
    /* Result : "4 row(s) returned
    (16 ms)" */

    Eu sei que se eu deletar ele não vai iniciar no 1 e vai iniciar de outro número maior que último utilizado. Só que ele não pode fazer por exemplo 53,54, 56,57,59,60 e pular números do nada. Já criei tabela nova pra teste e acontece a mesma coisa. Já estou achando que é bug do SQL SERVER R2 Express

    quarta-feira, 22 de agosto de 2012 17:14
  • Mas delete 'EM TUDO' não reinicia o sequencial do identity, pra você zerar sua tabela é necessário o comando TRUCANTE TABLE lotesms ou pelo comando DBCC CHECKIDENT('lotesms', RESEED, 0), mas sinceramente nunca peguei uma situação igual.
    quarta-feira, 22 de agosto de 2012 17:21
  • Fernando, pelo que entendi a questão não tem a ver com deleção de registros, pois se ele rodar duas vezes seguida o mesmo insert o valor já pula.

    Isso está muito estranho. E não é bug do Express não.

    Dá uma olhada em http://social.msdn.microsoft.com/Forums/pt-BR/520/thread/0e49e1cd-8acb-4f94-a31a-f3f3e9ba5f71.

    Será que pode estar acontecendo alguma tentativa "frustrada" de Insert entre essas duas vezes que voê dá o seu Insert?


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 17:26
    Moderador
  • Só de curiosidade, crie uma tabela da forma mais simples possível e faça o teste por favor.

    Create Table #Teste (Codigo int Identity, Nome Char(01))

    Insert Into #Teste Values ('A'), ('B'), ('C')

    Insert Into #Teste Values ('D'), ('E'), ('F')


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 17:28
    Moderador
  • A questão não é por causa do delete eu acho. Fiz assim: Parei o serviço do SQL  e iniciei novamente, abri outro banco e fiz as seguintes rotinas:

    /*------ 22/08/2012 14:30:50 --------*/
    
    IF EXISTS (SELECT 1 FROM sys.tables WHERE name='lotesms')
    	DROP TABLE LOTESMS
    GO
    
    /* Result : "-1 row(s) affected
    (47 ms)" */
    
    
    
    /*------ 22/08/2012 14:30:50 --------*/
    
    
    
    CREATE TABLE [dbo].[lotesms] (
      [id] int IDENTITY(1, 1) NOT NULL,
      [teste] varchar(1) COLLATE Latin1_General_CI_AS NULL
    )
    ON [PRIMARY]
    GO
    
    /* Result : "-1 row(s) affected
    (16 ms)" */
    
    
    
    /*------ 22/08/2012 14:30:50 --------*/
    
    
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    GO
    
    /* Result : "1 row(s) affected
    1 row(s) affected
    (62 ms)" */
    
    
    
    /*------ 22/08/2012 14:30:50 --------*/
    
    
    
    select * from lotesms
    GO
    
    /* Result : "2 row(s) returned
    (0 ms)" */
    
    
    
    /*------ 22/08/2012 14:31:02 --------*/
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    GO
    
    /* Result : "1 row(s) affected
    1 row(s) affected
    (15 ms)" */
    
    
    
    /*------ 22/08/2012 14:31:14 --------*/
    
    select * from lotesms
    GO
    
    /* Result : "4 row(s) returned
    (16 ms)" */
    
    
    
    /*------ 22/08/2012 14:31:23 --------*/
    
    insert into LOTESMS(teste) values ('1')
    insert into LOTESMS(teste) values ('2')
    GO
    
    /* Result : "1 row(s) affected
    1 row(s) affected
    (16 ms)" */
    
    
    
    /*------ 22/08/2012 14:31:25 --------*/
    
    select * from lotesms
    GO
    
    /* Result : "6 row(s) returned
    (16 ms)" */

    e agora pulou 3, vejam:

    quarta-feira, 22 de agosto de 2012 17:37
  • Está tendo tentativa de Insert por trás disso.

    Cria a tabela com Identity puro por favor. É pra dar no mesmo, mas...

    CREATE TABLE [dbo].[lotesms] (
      [id] int IDENTITY,
      [teste] varchar(1)
    )
    ON [PRIMARY]
    GO


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 17:41
    Moderador
  • Outra coisa: antes de começar a executar seus Insert's, abra o Profiler para monitorar e ver se tem mais alguma coisa sendo executada.

    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 17:42
    Moderador
  • Veja também, por favor, como está a configuração de paralelismo (qual o valor):

    Select * From sys.configurations Where name = 'max degree of parallelism'


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 22 de agosto de 2012 17:54
    Moderador
  • Consegui resolver em partes.

    Fiz os insert's através do SQL Server Management Studio e foi de boa.

    incrementou só 1.

    E através do SQL Manager Lite for Sql Server 3.8.0.2

    incrementa 2 ou 3, conforme o banco.

    Pode ser configuração, ou bug mesmo. Mas agradeço a todos que me ajudaram.

    • Marcado como Resposta Luis Olivetti quarta-feira, 22 de agosto de 2012 18:33
    quarta-feira, 22 de agosto de 2012 18:17