Como encontrar o próximo valor gerado para uma coluna de incremento automático?

6

Eu enfrento alguns problemas com as colunas de incremento automático do IBM DB2. No início, todas as minhas colunas foram definidas como GENERATED ALWAYS , mas como tive problemas com o comando "db2 import ...", mudei para GENERATED BY DEFAULT . Isso é necessário, pois preciso que os IDs sejam consistentes, porque outras tabelas fazem referência a eles. Portanto, usar "db2 import ... modified by identityignore ..." não é uma opção.

Quando importo dados agora, os IDs são inseridos corretamente, mas sempre que faço isso, lembro de definir um novo início para a coluna de incremento automático obtendo o ID + 1 mais alto e alterando a coluna da seguinte forma:

SELECT MAX(mycolumn)+ 1 FROM mytable;
ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>;

Se eu esquecer isso, uma instrução de inserção falhará com um erro de PK duplicado, já que a coluna de incremento automático é a chave primária.

Então minha pergunta é: Existe uma maneira de encontrar o próximo valor para uma coluna de incremento automático, para que eu pudesse escrever instruções que verificassem, se esse valor fosse menor que o SELECT MAX e precisasse ser definido?

ou: Isso não é tão complicado quanto parece para mim? Eu poderia de alguma forma importar dados, preservando os IDs e ter a coluna de auto-incremento ainda funcionando como esperado?

    
por Tim Büthe 05.06.2009 / 12:11

4 respostas

4

Tim, enfrentei o mesmo problema em que precisei reiniciar a identidade para o próximo valor. Eu estava usando o db2v9.1.

Infelizmente, não há como especificar o próximo valor automaticamente. Conforme a documentação do DB2, o valor deve ser uma 'constante numérica'. Daí eu tive que fazer um select max (id), pegar o valor e substituí-lo no arquivo alter..restart manualmente.

Não me lembro se tentei isso - mas você pode escrever um sp onde max (id) é definido em uma variável e atribuir a variável no alter ... restart stmt. (Eu sou incapaz de tentar como eu não tenho acesso a qualquer banco de dados db2 mais). Eu duvido que funcione embora. (Se funcionar, me avise:))

Referência do DB2:

RESTART ou RESTART WITH constante numérica

Redefine o estado da seqüência associada à coluna de identidade. Se WITH numérica constante não for especificado, a seqüência da coluna de identidade será reiniciada no valor especificado, implícita ou explicitamente, como o valor inicial quando a coluna de identidade foi originalmente criada. A coluna deve existir na tabela especificada (SQLSTATE 42703) e já deve estar definida com o atributo IDENTITY (SQLSTATE 42837). RESTART não altera o valor START WITH original.

A constante numérica é uma constante numérica exata que pode ser qualquer valor positivo ou negativo que possa ser atribuído a essa coluna (SQLSTATE 42815), sem dígitos diferentes de zero existentes à direita do ponto decimal (SQLSTATE 428FA). A constante numérica será usada como o próximo valor da coluna.

    
por 09.06.2009 / 13:30
2

Você não pode usar um número de seqüência no DB2 e depois usar a sequência. nextval ()?

Link para gerar automaticamente valores sequenciais no DB2: link

    
por 18.12.2012 / 09:59
1

Seu problema talvez esteja resolvido até agora, mas para todos os outros com o mesmo problema: posso oferecer uma solução para obter o max_id +1 para todas as tabelas. A única restrição é que a coluna de origem deve ser uma coluna de incremento automático (GENERATED = 'D'). O conjunto de resultados pode ser executado via clp ou outras ferramentas de consulta.

SELECT   'alter table ' || rtrim(TABSCHEMA) || '.' || TABNAME || ' alter column ' || COLNAME || ' restart with ' || 
cast((case when (trim ((replace ( HIGH2KEY, '+' , '' )))) = '' then 0 else integer(trim ((replace ( HIGH2KEY, '+' , '' ))))+2 end) as varchar(20)) 
|| ' ;'
FROM     SYSCAT.COLUMNS
WHERE    GENERATED = 'D'
    
por 24.11.2011 / 16:24
0
  1. por que você pensa em usar o incremento automático se estiver importando dados para essa coluna manualmente? esta auto-incremento não está sendo usada,
  2. Em um aplicativo semelhante aqui eu escrevi um SP -     uma. chama a opção admin_cmd - load     b. seleciona o max (id) - e os carrega junto com o timestamp atual para uma tabela de log Basta consultar a tabela de log e atualizar usando um script bash / windows. Simples ....
por 15.12.2009 / 11:45