[ GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( START WITH ConstanteInteira [ ,INCREMENT BY ConstanteInteira] ) ] ] ]
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.
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.
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.
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.
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.
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.
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');