Como definir a chave primária de incremento automático no PostgreSQL?

Eu tenho uma tabela no PostgreSQL com 22 colunas, e eu quero adicionar uma chave primária de auto-incremento.

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 de criação automática no PostgreSQL sem recriar a tabela novamente?

Tente este comando:

 ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY; 

Experimente com o mesmo usuário do database que você criou a tabela.

Autoincremento da chave primária no postgresql:

Etapa 1, crie sua tabela:

 CREATE TABLE epictable ( mytable_key serial primary key, moobars VARCHAR(40) not null, foobars DATE ); 

Etapa 2, insira valores em sua tabela assim, observe que mytable_key não está especificado na primeira lista de parâmetros, isso faz com que a sequência padrão seja de incremento automático.

 insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01') insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02') 

Passo 3, selecione * da sua tabela:

 el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable" 

Etapa 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 incrementada automaticamente.

ProTip:

Você deve sempre estar usando uma chave primária em sua tabela 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 depender de fornecer uma semente exclusiva para a function hash. Se nenhuma coluna de chave primária estiver disponível, a function de hash se tornará ineficiente, pois selecionará outro conjunto de colunas como uma chave.

Crie uma chave primária de incremento automático no postgresql, usando uma sequência personalizada:

Etapa 1, crie 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 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!' ); 

Etapa 4, observe as linhas

 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 possuem chaves que começam em 1 e são incrementadas por 1, conforme definido pela seqüência.

Bônus Elite ProTip:

Os programadores odeiam digitar e digitar o nextval('splog_adfarm_seq') é irritante. Você pode digitar DEFAULT para esse parâmetro, desta forma:

 insert into splog_adfarm values ( DEFAULT, 'Sufficient intelligence to outwit a thimble.' ); 

Para o acima funcionar, você tem que definir um valor padrão para essa coluna de chave na tabela splog_adfarm. Que é mais bonito.

Se você quiser fazer isso no pgadmin, é muito mais fácil. Parece que no postgressql, para adicionar um incremento automático a uma coluna, primeiro precisamos criar uma sequência de incremento automático e adicioná-la à coluna desejada. Eu fiz assim.

1) Em primeiro lugar você precisa ter certeza de que existe uma chave primária para a sua mesa. Além disso, mantenha o tipo de dados da chave primária em bigint ou smallint. (Eu usei bigint, não consegui encontrar um tipo de dados chamado serial como mencionado em outras respostas em outro lugar)

2) Em seguida, adicione uma sequência clicando com o botão direito em sequence-> add new sequence . Se não houver dados na tabela, deixe a sequência como está, não faça nenhuma alteração. Apenas salve. Se houver dados existentes, adicione o último ou o maior valor na coluna de chave primária ao valor Atual na guia Definições, conforme mostrado abaixo. insira a descrição da imagem aqui

3) Finalmente, adicione a linha nextval('your_sequence_name'::regclass) ao valor Default em sua chave primária como mostrado abaixo.

insira a descrição da imagem aqui Certifique-se de que o nome da sequência esteja correto aqui. Isso é tudo e o incremento automático deve funcionar.

Se você quiser usar números em uma sequência, defina uma nova sequência com algo como

 CREATE SEQUENCE public.your_sequence INCREMENT 1 START 1 MINVALUE 1 ; 

e depois altere a tabela para usar a sequência do id:

 ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass); 

Talvez eu esteja um pouco atrasado para responder a essa pergunta, mas estou trabalhando nesse assunto no meu trabalho 🙂

Eu queria escrever a coluna ‘a_code’ = c1, c2, c3, c4 …

Primeiramente abri uma coluna com o nome ref_id e o tipo serial . Então resolvi meu problema com este comando:

 update myschema.mytable set a_code=cast('c'||"ref_id" as text)