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


259

Eu tenho uma tabela no PostgreSQL com 22 colunas e quero adicionar uma chave primária de incremento automático.

Tentei criar uma coluna chamada iddo 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 esse problema? Como adicionar e criar uma chave primária de incremento automático no PostgreSQL sem recriar a tabela novamente?

Respostas:


292

Tente este comando:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Experimente com o mesmo usuário do banco de dados que você criou a tabela.


75
(a chave aqui é a utilização de uma série ou tipo de dados BIGSERIAL, o qual cria uma sequência de trás dos bastidores e incrementa / o utiliza no momento da inserção)
rogerdpack

16
e se você quiser referenciá-lo de outra tabela, use inteiro ou bigint #
Ward

2
@satishkilari: sim, a sintaxe é ALTER TABLE mytable ADD PRIMARY KEY (column);. O Postgresql verificará se a coluna não contém NULLs.
AH

3
Obtendo este erro no pgAdmin 4. Ambos bigseriale serialestão dando o mesmo erro:ERROR: syntax error at or near "BIGSERIAL"
adi 30/10

5
Também obtendo o erro de sintaxe usando bigserial ou serial. Existe uma versão mínima do postgresql para isso?
dacDave

251

Chave primária de incremento automático 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 incrementada automaticamente.

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

Etapa 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 usar 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 (forçada exclusiva e não nula) estiver disponível, ela poderá ser utilizada para fornecer uma semente única para a função hash. Se nenhuma coluna de chave primária estiver disponível, a função hash se tornará ineficiente, pois seleciona outro conjunto de colunas como chave.


21
Um nitpick menor, SERIALcria um sequencebastidores: postgresql.org/docs/9.2/static/…
carbocation

1
é possível fazer a chave primária (coluna existente) em uma mesa, sem acrescentar qualquer nova coluna
satish Kilari

uma chave estrangeira será declarada com thing_id int references epictable(mytable_key)trabalho?

36

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;

Etapa 2, crie sua tabela

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

Etapa 3, insira na sua tabela

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

Bônus Elite ProTip:

Os programadores odeiam digitar, e digitar o nextval('splog_adfarm_seq')é irritante. Você pode digitar DEFAULTpara esse parâmetro, assim:

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

Para que o trabalho acima funcione, é necessário definir um valor padrão para essa coluna-chave na tabela splog_adfarm. O que é mais bonito.


2
Quais são os benefícios de sequências personalizadas? Provavelmente segurança?
Léo Léopold Hertz ·

1
@Masi Um uso de uma sequência personalizada poderia facilitar a replicação master-master - o que seria útil se o link de dados entre dois data centers estivesse quebrado - permitindo a criação de registros nos dois servidores com IDs diferentes, o que facilita a sincronização dos backups dos bancos de dados, mantendo os IDs gerados em locais separados.
Vincent McNabb 15/15

16

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 necessária. Eu fiz assim.

1) Primeiro, você precisa se certificar de que existe uma chave primária para sua tabela. Mantenha também o tipo de dados da chave primária em bigint ou smallint. (Usei bigint, não foi possível encontrar um tipo de dados chamado serial, conforme mencionado em outras respostas em outros lugares)

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

3) Por fim, adicione a linha nextval('your_sequence_name'::regclass)ao valor padrão na sua chave primária, como mostrado abaixo.

insira a descrição da imagem aqui Verifique se o nome da sequência está correto aqui. Isso é tudo e o incremento automático deve funcionar.


9

Se você deseja 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, em seguida, altere a tabela para usar a sequência para o ID:

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

Preciso criar uma nova sequência para cada tabela?
Bharat Chhabra

Você pode compartilhar a mesma sequência para tabelas diferentes, mas a sequência aumentará para cada registro em cada tabela.
Acaruci

1

Eu tentei o seguinte script para incrementar automaticamente a chave primária no PostgreSQL.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

EDITAR:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

A palavra-chave SERIAL cria automaticamente uma sequência para a respectiva coluna.


Você pode redefinir um SERIAL como faz para uma SEQUÊNCIA?
thoroc 5/02

1
Sim !, verifiquei com ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;e está funcionando.
Asad Shakeel

0

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 ...

Primeiro, abri uma coluna com o nome ref_ide o tipo serial. Então eu resolvi meu problema com este comando:

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

é possível fazer a chave primária (coluna existente) em uma mesa, sem acrescentar qualquer nova coluna
satish Kilari
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.