Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

MySQL equivalente ao SEQUENCE.NEXTVAL da Oracle


http://docs.oracle.com/cd/E17952_01/refman-5.5-en/example-auto-increment.html

3.6.9. Usando AUTO_INCREMENT

O atributo AUTO_INCREMENT pode ser usado para gerar uma identidade exclusiva para novas linhas:
CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
);

INSERT INTO animals (name) VALUES
    ('dog'),('cat'),('penguin'),
    ('lax'),('whale'),('ostrich');

SELECT * FROM animals;
Which returns:

+----+---------+
| id | name    |
+----+---------+
|  1 | dog     |
|  2 | cat     |
|  3 | penguin |
|  4 | lax     |
|  5 | whale   |
|  6 | ostrich |
+----+---------+

Nenhum valor foi especificado para a coluna AUTO_INCREMENT, então o MySQL atribuiu números de sequência automaticamente. Você também pode atribuir explicitamente NULL ou 0 à coluna para gerar números de sequência.

Você pode recuperar o valor AUTO_INCREMENT mais recente com a função SQL LAST_INSERT_ID() ou a função C API mysql_insert_id(). Essas funções são específicas da conexão, portanto, seus valores de retorno não são afetados por outra conexão que também esteja executando inserções.

Use o menor tipo de dados inteiro para a coluna AUTO_INCREMENT que seja grande o suficiente para conter o valor de sequência máximo que você precisará. Quando a coluna atinge o limite superior do tipo de dados, a próxima tentativa de gerar um número de sequência falha. Use o atributo UNSIGNED se possível para permitir um intervalo maior. Por exemplo, se você usar TINYINT, o número de sequência máximo permitido é 127. Para TINYINT UNSIGNED, o máximo é 255. Consulte a Seção 11.2.1, “Tipos de inteiros (valor exato) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT ” para os intervalos de todos os tipos inteiros.

ObservaçãoPara uma inserção de várias linhas, LAST_INSERT_ID() e mysql_insert_id() na verdade retornam a chave AUTO_INCREMENT da primeira das linhas inseridas. Isso permite que inserções de várias linhas sejam reproduzidas corretamente em outros servidores em uma configuração de replicação.

Se a coluna AUTO_INCREMENT for parte de vários índices, o MySQL gera valores de sequência usando o índice que começa com a coluna AUTO_INCREMENT, se houver. Por exemplo, se a tabela animais contivesse índices PRIMARY KEY (grp, id) e INDEX (id), o MySQL ignoraria a PRIMARY KEY para gerar valores de sequência. Como resultado, a tabela conteria uma única sequência, não uma sequência por valor grp.

Para começar com um valor AUTO_INCREMENT diferente de 1, defina esse valor com CREATE TABLE ou ALTER TABLE, assim:

mysql> ALTER TABLE tbl AUTO_INCREMENT =100;InnoDB Notas

Para tabelas InnoDB, tenha cuidado se você modificar a coluna que contém o valor de incremento automático no meio de uma sequência de instruções INSERT. Por exemplo, se você usar uma instrução UPDATE para colocar um valor novo e maior na coluna de incremento automático, um INSERT subsequente poderá encontrar um erro de “Entrada Duplicada”. O teste se um valor de incremento automático já está presente ocorre se você fizer um DELETE seguido por mais instruções INSERT ou quando você COMMIT a transação, mas não após uma instrução UPDATE.

Notas do MyISAM

Para tabelas MyISAM, você pode especificar AUTO_INCREMENT em uma coluna secundária em um índice de várias colunas. Nesse caso, o valor gerado para a coluna AUTO_INCREMENT é calculado como MAX(auto_increment_column) + 1 WHERE prefix=given-prefix. Isso é útil quando você deseja colocar dados em grupos ordenados.
CREATE TABLE animals (
    grp ENUM('fish','mammal','bird') NOT NULL,
    id MEDIUMINT NOT NULL AUTO_INCREMENT,
    name CHAR(30) NOT NULL,
    PRIMARY KEY (grp,id)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;
Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

Nesse caso (quando a coluna AUTO_INCREMENT faz parte de um índice de várias colunas), os valores AUTO_INCREMENT são reutilizados se você excluir a linha com o maior valor AUTO_INCREMENT em qualquer grupo. Isso acontece mesmo para tabelas MyISAM, para as quais os valores AUTO_INCREMENT normalmente não são reutilizados.

Leitura adicional

Mais informações sobre AUTO_INCREMENT estão disponíveis aqui:

Como atribuir o atributo AUTO_INCREMENT a uma coluna:Seção 13.1.17, “Sintaxe CREATE TABLE”, e Seção 13.1.7, “Sintaxe ALTER TABLE”.

Como AUTO_INCREMENT se comporta dependendo do modo SQL NO_AUTO_VALUE_ON_ZERO:Seção 5.1.7, “Modos SQL do Servidor”.

Como usar a função LAST_INSERT_ID() para localizar a linha que contém o valor AUTO_INCREMENT mais recente:Seção 12.14, “Funções de informação”.

Configurando o valor AUTO_INCREMENT a ser usado:Seção 5.1.4, “Variáveis ​​do sistema do servidor”.

AUTO_INCREMENT e replicação:Seção 16.4.1.1, “Replicação e AUTO_INCREMENT”.

Variáveis ​​do sistema do servidor relacionadas a AUTO_INCREMENT (auto_increment_increment e auto_increment_offset) que podem ser usadas para replicação:Seção 5.1.4, “Variáveis ​​do sistema do servidor”.

http://search.oracle.com/search/search?q=auto_increment&group=Documentation&x=0&y=0