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 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 esse problema? Como adicionar e criar uma chave primária de incremento automático no PostgreSQL sem recriar a tabela novamente?
sql
postgresql
mkn
fonte
fonte
ALTER TABLE mytable ADD PRIMARY KEY (column);
. O Postgresql verificará se a coluna não contém NULLs.bigserial
eserial
estão dando o mesmo erro:ERROR: syntax error at or near "BIGSERIAL"
Chave primária de incremento automático no postgresql:
Etapa 1, crie sua tabela:
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.
Etapa 3, selecione * da sua tabela:
Etapa 4, interprete a saída:
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.
fonte
SERIAL
cria umsequence
bastidores: postgresql.org/docs/9.2/static/…thing_id int references epictable(mytable_key)
trabalho?Crie uma chave primária de incremento automático no postgresql, usando uma sequência personalizada:
Etapa 1, crie sua sequência:
Etapa 2, crie sua tabela
Etapa 3, insira na sua tabela
Etapa 4, observe as linhas
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 digitarDEFAULT
para esse parâmetro, assim: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.
fonte
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.
3) Por fim, adicione a linha
nextval('your_sequence_name'::regclass)
ao valor padrão na sua chave primária, como mostrado abaixo.Verifique se o nome da sequência está correto aqui. Isso é tudo e o incremento automático deve funcionar.
fonte
Se você deseja usar números em uma sequência, defina uma nova sequência com algo como
e, em seguida, altere a tabela para usar a sequência para o ID:
fonte
Eu tentei o seguinte script para incrementar automaticamente a chave primária no PostgreSQL.
EDITAR:
A palavra-chave SERIAL cria automaticamente uma sequência para a respectiva coluna.
fonte
ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;
e está funcionando.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_id
e o tiposerial
. Então eu resolvi meu problema com este comando:fonte