Eu tenho uma tabela com mais de 1000000 linhas que foram importadas do arquivo CSV. A tabela não tinha uma chave primária, quero adicionar uma com bigint incrementado à tabela. Esta é a minha tabela DDL:
CREATE TABLE public.ecdict (
word varchar(256) NULL,
phonetic varchar(512) NULL,
definition varchar(80000) NULL,
"translation" varchar(80000) NULL,
pos varchar(100) NULL,
collins int4 NULL,
oxford int4 NULL,
tag varchar(128) NULL,
bnc int4 NULL,
frq int4 NULL,
exchange varchar(128) NULL,
detail varchar(2000) NULL,
audio varchar(8) NULL,
id int8 NULL
);
A id
coluna é nova add e todos os dados são NULL, tentei usar este comando:
update ecdict c
set id = c2.seqnum
from (
select c2.*, row_number() over () as seqnum
from ecdict c2
) c2
where c2.pkid = c.pkid;
Mas não consegui encontrar uma coluna exclusiva para a tabela para junção, o que devo fazer para adicionar a id
coluna com valores incrementados bigint
?
Adicione a
id
coluna assim, e a coluna será preenchida com números de série automaticamente e indexada como PK:Requer Postgres 10 ou posterior. Use uma
serial
coluna para versões mais antigas (ou qualquer outra):Ver:
Aciona uma reescrita de toda a tabela, é claro. E os números são atribuídos arbitrariamente pela ordem física atual das linhas.
Como alternativa , você pode adicionar uma coluna
serial
ouIDENTITY
à sua tabela antes de importar os dados do seu CSV e não atribuí-los no processo, então o padrão é os números de série automaticamente.À parte: Por quê
bigint
?integer
deve ser bom o suficiente para 1 milhão de linhas - a menos que você espere muito crescimento e/ou rotatividade.Para responder à sua pergunta original : você pode usar a coluna do sistema
ctid
assim:Ver:
Mas o primeiro conselho é muito melhor para o caso em questão.