especifica????o-de-coluna-gerada

[ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
[ ( START WITH ConstanteInteira
[ ,INCREMENT BY ConstanteInteira] ) ]  ]  ]

Atributos da coluna de identidade

Nas colunas SMALLINT, INT e BIGINT com atributo de identidade, o Derby atribui automaticamente valores inteiros incrementados para a coluna. Os atributos da coluna de identidade se comportam como os outros valores padr??o, ou seja, quando a instru????o de inser????o n??o especifica o valor para a coluna, o Derby fornece automaticamente o valor. Entretanto, o valor n??o ?? uma constante; o Derby incrementa automaticamente o valor padr??o na hora da inser????o.

A palavra chave IDENTITY somente pode ser especificada quando o tipo de dado associado ?? coluna for um dos seguintes tipos inteiros exatos.
  • SMALLINT
  • INT
  • BIGINT
Existem dois tipos de coluna de identidade no Derby: aquelas que s??o sempre geradas (GENERATED ALWAYS), e aquelas que s??o geradas por padr??o (GENERATED BY DEFAULT).
GENERATED ALWAYS
Uma coluna de identidade que ?? sempre gerada, incrementa o valor padr??o em todas as inser????es e armazena o valor incrementado na coluna. Ao contr??rio dos outros valores padr??o, n??o ?? poss??vel inserir diretamente um valor ou atualizar uma coluna de identidade que ?? sempre gerada. Por isso, deve ser especificada a palavra chave DEFAULT ao fazer inser????o na coluna de identidade, ou n??o incluir a coluna de identidade na lista de colunas na inser????o. Por exemplo:
CREATE TABLE SAUDA????ES (
    I  INT GENERATED ALWAYS AS IDENTITY,
    CH CHAR(50));
INSERT INTO SAUDA????ES VALUES (DEFAULT, 'al??');
INSERT INTO SAUDA????ES(CH) VALUES ('bom dia');
Os valores gerados automaticamente na coluna de identidade GENERATED ALWAYS s??o ??nicos. A cria????o de uma coluna de identidade n??o cria um ??ndice para a coluna.
GENERATED BY DEFAULT

Uma coluna de identidade gerada por padr??o, somente incrementa e utiliza o valor padr??o nas inser????es quando n??o ?? fornecido nenhum valor expl??cito. Ao contr??rio da colunas sempre geradas, pode ser especificado um valor na instru????o de inser????o a ser utilizado no lugar do valor padr??o gerado.

Para utilizar o valor gerado, deve ser especificada a palavra chave DEFAULT ao inserir na coluna de identidade, ou n??o incluir a coluna de identidade na lista de colunas da inser????o. Para especificar um valor, este deve ser inclu??do na instru????o de inser????o. Por exemplo:
CREATE TABLE SAUDA????ES (
    I  INT GENERATED BY DEFAULT AS IDENTITY,
    CH CHAR(50));
-- especificar o valor "1":
INSERT INTO SAUDA????ES VALUES (1, 'ol??');
-- usar o padr??o gerado
INSERT INTO SAUDA????ES VALUES (DEFAULT, 'salut');
-- usar o padr??o gerado
INSERT INTO SAUDA????ES(CH) VALUES ('bonjour'); 
Deve ser observado que ao contr??rio das colunas GENERATED ALWAYS, as colunas GENERATED BY DEFAULT n??o garantem unicidade. Portanto, no exemplo acima as linhas ol?? e salut possuem o valor de identidade igual a "1", porque a coluna gerada come??a por "1" e o valor especificado pelo usu??rio tamb??m ?? "1". Para n??o permitir duplicidade, especialmente ao carregar ou importar dados, a tabela deve ser criada utilizando um valor para START WITH correspondente ao primeiro valor de identidade que o sistema deve atribuir. Para verificar esta condi????o e n??o permiti-la, pode ser utilizada uma chave prim??ria ou restri????o de unicidade na coluna de identidade GENERATED BY DEFAULT.

Por padr??o, o valor inicial da coluna de identidade ?? 1, e o valor do incremento ?? 1. Podem ser especificados valores diferentes do padr??o para o valor inicial e para o incremento ao definir a coluna utilizando as palavras chave STARTS WITH e INCREMENT BY. Se for especificado um n??mero negativo para o valor do incremento, o Derby decrementar?? o valor a cada inser????o. Se o valor for 0, ou positivo, o Derby incrementar?? o valor a cada inser????o.

Os valores m??ximos e m??nimos permitidos nas colunas de identidade s??o determinados pelo tipo de dado da coluna. A tentativa de inserir um valor fora da faixa de valores suportados pelo tipo de dado lan??a uma exce????o.
Tabela 1. Valores m??ximos e m??nimos para colunas com especifica????o de coluna gerada
Tipo de dado Valor m??ximo Valor m??nimo
SMALLINT 32.767 (java.lang.Short.MAX_VALUE) -32.768 (java.lang.Short.MIN_VALUE)
INT 2.147.483.647 (java.lang.Integer.MAX_VALUE) -2.147.483.648 (java.lang.Integer.MIN_VALUE)
BIGINT 9.223.372.036.854.775.807 (java.lang.Long.MAX_VALUE) -9.223.372.036.854.775.808 (java.lang.Long.MIN_VALUE)

Os valores gerados automaticamente na coluna de identidade s??o ??nicos. Deve ser utilizada uma restri????o de chave prim??ria ou de unicidade para garantir a unicidade. A cria????o da coluna de identidade n??o cria um ??ndice para a coluna.

A fun????o IDENTITY_VAL_LOCAL ?? uma fun????o n??o determin??stica que retorna o valor atribu??do mais recentemente a uma coluna de identidade. Consulte IDENTITY_VAL_LOCAL para obter mais informa????es.

Nota: Deve ser especificado o nome do esquema, da tabela e da coluna utilizando letras mai??sculas e min??sculas conforme os nomes estejam armazenados nas tabelas do sistema -- ou seja, todas as letras em mai??sculo, a menos que tenham sido utilizados identificadores delimitados para criar estes objetos no banco de dados.

O Derby mant??m o ??ltimo valor incrementado para a coluna no cache. Tamb??m armazena o pr??ximo valor incrementado para a coluna no disco na coluna AUTOINCREMENTVALUE da tabela do sistema SYS.SYSCOLUMNS. Desfazer a transa????o n??o desfaz este valor, portanto transa????es desfeitas podem deixar "espa??os" nos valores inseridos automaticamente na coluna de identidade. O Derby se comporta desta maneira para evitar bloqueio na linha de SYS.SYSCOLUMNS pela dura????o da transa????o, e para manter a simultaneidade alta.

Quando acontece uma inser????o em uma instru????o-SQL-engatilhada, o valor inserido pela instru????o-SQL-engatilhada na coluna de identidade ?? dispon??vel a partir de ConnectionInfo somente dentro do c??digo do gatilho. O c??digo do gatilho tamb??m pode ver o valor inserido pela instru????o que fez o gatilho disparar. Entretanto, a instru????o que fez o gatilho disparar n??o pode ver o valor inserido pela instru????o-SQL-engatilhada na coluna de identidade. Da mesma maneira, os gatilhos podem ser aninhados (ou recursivos). Uma instru????o SQL pode fazer o gatilho T1 disparar. T1, por sua vez, executa uma instru????o SQL que faz o gatilho T2 disparar. Se tanto T1 quanto T2 inserem linhas em uma tabela que faz o Derby inserir em uma coluna de identidade, o gatilho T1 n??o poder?? ver o valor produzido pela inser????o feita por T2, mas T2 poder?? ver o valor produzido pela inser????o feita por T1. Cada n??vel de aninhamento pode ver os valores incrementados gerados por si pr??prio e pelos n??veis de aninhamento anteriores, por todo o percurso at?? a instru????o SQL de n??vel superior que deu in??cio aos gatilhos recursivos. Somente podem existir 16 n??veis de recursividade de gatilho.

Exemplo

CREATE TABLE SAUDA????ES (
    I INT GENERATED BY DEFAULT AS IDENTITY (START WITH 2, INCREMENT BY 1),
    CH CHAR(50));
-- especificar o valor  "1":
INSERT INTO SAUDA????ES VALUES (1, 'ol??');
-- usar o valor gerado
INSERT INTO SAUDA????ES VALUES (DEFAULT, 'salut');
-- usar o valor gerado
INSERT INTO SAUDA????ES(CH) VALUES ('bonjour'); 
Refer??ncias relacionadas
defini????o-da-coluna