Eu tenho uma tabela no PostgreSQL com 22 colunas, e quero adicionar uma chave primária de incremento automático.
Eu tentei criar uma coluna chamada id
do tipo BIGSERIAL, mas o pgadmin respondeu com um erro:
ERROR: sequence must have same owner as table it is linked to.
Alguém sabe como resolver este problema? Como eu adiciono uma chave primária auto-incrementante no PostgreSQL sem recriar a tabela novamente?
Passo 1, crie a sua mesa:
CREATE TABLE epictable
(
mytable_key serial primary key,
moobars VARCHAR(40) not null,
foobars DATE
);
Passo 2, insira valores na sua tabela assim, note que a mytable_key não está especificada na primeira lista de parâmetros, isso faz com que a seqüência padrão seja auto-incrementada.
insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')
*Passo 3, seleccione da sua mesa:**
el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"
Passo 4, interprete a saída:
mytable_key | moobars | foobars
-------------+-----------------------+------------
1 | delicious moobars | 2012-05-01
2 | world wide interblags | 2012-05-02
(2 rows)
Observe que a coluna mytable_key foi automaticamente incrementada.
ProTip:
Você deve estar sempre usando uma chave primária em sua mesa porque o postgresql usa internamente estruturas de tabela de hash para aumentar a velocidade de inserções, exclusões, atualizações e seleções. Se uma coluna de chave primária (que é forçada única e não-nula) estiver disponível, ela pode ser dependente para fornecer uma semente única para a função de hash. Se nenhuma coluna chave primária estiver disponível, a função hash se torna ineficiente, pois seleciona algum outro conjunto de colunas como uma chave.
Criar uma chave primária com incremento automático no postgresql, usando uma sequência personalizada:
Passo 1, crie a sua sequência:
create sequence splog_adfarm_seq
start 1
increment 1
NO MAXVALUE
CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;
**Passo 2, crie a sua mesa***
CREATE TABLE splog_adfarm
(
splog_key INT unique not null,
splog_value VARCHAR(100) not null
);
**Passo 3, insira na sua mesa***
insert into splog_adfarm values (
nextval('splog_adfarm_seq'),
'Is your family tree a directed acyclic graph?'
);
insert into splog_adfarm values (
nextval('splog_adfarm_seq'),
'Will the smart cookies catch the crumb? Find out now!'
);
**Passo 4, observe as filas***
el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"
splog_key | splog_value
----------+--------------------------------------------------------------------
1 | Is your family tree a directed acyclic graph?
2 | Will the smart cookies catch the crumb? Find out now!
(3 rows)
As duas linhas têm teclas que começam em 1 e são incrementadas em 1, conforme definido pela sequência.
Bonus Elite ProTip:
Programadores odeiam digitação, e digitar o nextval('splog_adfarm_seq')
é irritante. Você pode digitar DEFAULT
para esse parâmetro, ao invés disso, assim:
insert into splog_adfarm values (
DEFAULT,
'Sufficient intelligence to outwit a thimble.'
);
Para que o acima descrito funcione, é necessário definir um valor padrão para aquela coluna chave na tabela splog_adfarm. O que é mais bonito.