sábado, 12 de setembro de 2009

Auto Incremento no SQL Server e MySQL

Usar campos com auto incremento no banco de dados tem várias vantagens, você previne erros de chaves primárias duplicadas e pode se abstrair deste controle nos programas que acessam o banco. Ele funciona da seguinte forma: para cada inserção de registro o banco se encarrega de sempre incrementar um campo de chave primária com um valor seqüencial.

SQL Server

No SQL Server você pode fazer isso através da propriedade IDENTITY, ela recebe dois valores: o primeiro é o valor inicial e o segundo é o valor de incremento, exemplo:

CREATE TABLE DBO.TABELA (
ID INT IDENTITY (1,1) NOT NULL, / inicia em 1 e incrementa de 1 em 1
NOME VARCHAR(50) NULL,
EMAIL VARCHAR(50) NULL,
PRIMARY KEY (ID)
);


Se a tabela já foi criada você pode alterá-la assim:
ALTER TABLE DBO.TABELA ALTER COLUMN ID INT IDENTITY(1,1);

No comando de inserção você não precisará mais referenciar o campo com auto incremento:
INSERT INTO TABELA (NOME, EMAIL) VALUES (‘JOSE DA SILVA’, ‘jose@mail.com’);

Se por alguma razão você precisar reiniciar o auto incremento, os campos Indentity Increment do SQL Server possuem um contador mantido nas tabelas do sistema, para alterar as mesmas deve-se utilizar o comando DBCC. Para reiniciar completamente o contador, iniciando do zero novamente, use:
DBCC CHECKIDENT ('TABELA', RESEED, 0)

Para colocar o ultimo numero utilizado:
DBCC CHECKIDENT (TABELA, RESEED, (SELECT MAX(ID) FROM TABELA))

Para saber qual o valor atual do campo use o comando IDENT_CURRENT():
SELECT IDENT_CURRENT(TABELA) IDENT_INCR (TABELA)

Para saber qual o valor de incremento use IDENT_INCR():
SELECT TABELA, IDENT_INCR(TABELA) AS IDENT_INCR
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_INCR(TABELA) IS NOT NULL


Para saber qual foi o valor inicial use IDENT_SEED ():
SELECT TABELA, IDENT_SEED(TABELA) AS IDENT_SEED
FROM INFORMATION_SCHEMA.TABLES
WHERE IDENT_SEED(TABELA) IS NOT NULL


MySQL

O processo é parecido no MySQL, a chave primária recebe a propriedade AUTO_INCREMENT:

CREATE TABLE TABELA (
ID INTEGER NOT NULL AUTO_INCREMENT,
NOME VARCHAR(50) NOT NULL ,
EMAIL VARCHAR(50) NOT NULL ,
PRIMARY KEY (ID)
) TYPE = InnoDB ROW_FORMAT = Default;


Para alterar uma tabela que já existe:
ALTER TABLE TABELA CHANGE ID ID INT AUTO_INCREMENT PRIMARY KEY;

Como você notou, a propriedade tem o valor inicial padrão de auto incremento como 1, e o incremento padrão de 1. Como o MySQL não tem uma função específica para isso, nesse caso para alterar o valor inicial de auto incremento você poderia usar o comando:
ALTER TABLE TABELA AUTO_INCREMENT = 100; / Iniciaria a partir de 100

Para saber qual o último valor do campo use:
SELECT MAX(ID) FROM TABELA;

Mas você deve estar se perguntando: E quanto ao Oracle? O Oracle tem um mecanismo muito eficiente para fazer auto incremento chamado Sequence. Breve estaremos falando deste mecanismo em um post especial.

3 comentários:

Ana Flavia disse...

vlw!! muito boa, me ajudou muitoi essa postagem!! bye

Marcelo disse...

Me ajudou tambem! legal continue assim!

Anônimo disse...

Isso não vai dar certo:

SELECT MAX(ID) FROM TABELA;

Imagine que você excluiu o registro de id 15, esse comando retornaria o registro de id 14, porém, o auto_increment está no id 16. O correto é:

SHOW TABLE STATUS LIKE 'nome_tabela'

Ele retorna todas as informações da tabela e uma delas é o Auto_increment

Abraço!!

Postar um comentário