MySQL: "Aonde está o auto-increment nessa porcaria? Ahhh... no MySQL era muito mais simples."
MS SQL Server: "o que!? Não tem IDENTITY??? Essa porcaria só podia ser free..."
Oracle: "pouts... vou ter que escrever sequences aqui também!?"
Sim.. eu fui um desses. E por um longo tempo eu fiz auto-incremento manualmente.
Até que em um ensolarado dia eu tomei uma Xiboquinha e li o manual (genial, não!?). Nesse dia eu me senti um idiota.
Não! PostgreSQL não implementa a propriedade auto-increment e muito menos a identity (e sim, isso é bom)!
Sim, assim como acontece nos dois SGBDs mais respeitados do mercado (Oracle, desde sei lá quando, e DB2, desde a versão 7.2), o PostgreSQL implementa o objeto SEQUENCE.
SEQUENCEs são reconhecidamente mais flexíveis!
Por outro lado, criar uma SEQUENCEs dá um baita trabalho. Linka-la a uma coluna então, nem se fala. Veja o exemplo abaixo:
-- Crio a tabela
CREATE TABLE tabela (
id integer NOT NULL,
nota integer
);
-- Crio a sequência
CREATE SEQUENCE tabela_id_seq
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
-- Relaciona a sequência com a coluna da tabela
ALTER SEQUENCE tabela_id_seq OWNED BY tabela.id;
ALTER TABLE tabela ALTER COLUMN id SET DEFAULT nextval('tabela_id_seq'::regclass);
Complicado... é... eu sei.
Mas por sorte Deus deu ao ser humano a preguiça. Foi graças a ela um cara criou um "pseudo-tipo" chamado serial.
O tipo serial cria um campo integer, cria a sequence e relaciona um ao outro automaticamente. Exemplo:
CREATE TABLE tabela (
id serial NOT NULL,
nota integer
);
O resultado será o mesmo
Nota 1:
Eventuais alterações no comportamento da SEQUENCE podem ser feitas com ALTER SEQUENCE normalmente.
Nota 2:
Além do tipo serial (int4) existe o bigserial (int8)
Nota 3:
Para recuperar o número gerado pela SEQUENCE em um INSERT use algo como INSERT INTO tabela (nota) VALUES(10) RETURNING id;
Nota 4:
Para garantir a integridade dos dados na entrada da tela use SELECT nextval('tabela_id_seq'::regclass). O número gerado nesse SELECT não se repetirá mesmo que a inserção seja cancelada.
Referência: http://www.postgresq...s-sequence.html
Edição feita por: boirock, 30/11/2008, 18:18.