quarta-feira, 17 de setembro de 2008

Auto incrementando a chave primária de tabelas no Postgresql

A maioria das pessoas que sempre utilizaram um sistema gerenciador de banco de dados como o Mysql se deparam com um problema quando estão migrando para o Postgresql. E o grande problema é que no postgresql você não pode usar a cláusula auto_increment na sua chave primária como é feito no mysql.
create table foo (
id int not null auto_increment primary key,
state enum('enabled', 'disabled')
state enum('enabled', 'disabled')
);
Agora você deve estar se perguntando. Como eu devo fazer entao?

Bom, vamos mostrar então.
Primeiramente deve-se criar uma nova ’sequencia’, que é feita utilizando o comando abaixo.
CREATE SEQUENCE nomeSequencia;
Por padrão se usa o nome da sequencia com o seguinte formato nomeTabela_nomePK_seq .
Utilizando o comando SQL desta forma a sua sequencia começará de 1. Utilizando a cláusuala START é possível definir o valor inicial da sequencia.
CREATE SEQUENCE nomeTabela_nomePK_seq START 103;
Agora para definir uma chave primária que se auto incrementa basta definir na hora da criação da tabela desta maneira.
create table nomeTabela (
id int not null primary key default nextval('nomeSequencia'),
outroCampo varchar(8)
);
Caso você não queira modificar a estrutura de uma tabela já pronta basta utilizar a funcao nextval() para incrementar o valor da sua chave primaria da seguinte maneira.
INSERT INTO nomeTabela(id, nomeDeUmCampo)
VALUES (nextval('nomeSequencia'), 'alguma coisa');
Exemplo:
create sequence teste_id_seq;

create table teste (
id int not null primary key default nextval('teste_id_seq'),
nome varchar(8)
);

insert into teste(nome) values ('nome 1');
insert into teste(nome) values ('nome 2');
insert into teste(nome) values ('nome 3');

1 comentários:

André disse...

Só complementando o que eu disse. Uma alternativa seria usar o tipo serial.

CREATE TABLE pessoa (
id SERIAL,
nome TEXT
);

é altomaticamente traduzido para

CREATE SEQUENCE pessoa_id_seq;
CREATE TABLE pessoa (
id INT4 NOT NULL DEFAULT nextval('pessoa_id_seq'),
nome TEXT
);