Respostas:
( Atualizado - Obrigado às pessoas que comentaram )
Suponha que você tenha uma tabela chamada test1
, à qual deseja adicionar uma id
coluna de chave primária (substituto) de incremento automático . O seguinte comando deve ser suficiente nas versões recentes do PostgreSQL:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Nas versões antigas do PostgreSQL (anteriores à 8.x?), Você tinha que fazer todo o trabalho sujo. A seguinte sequência de comandos deve fazer o truque:
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
Novamente, nas versões recentes do Postgres, isso é aproximadamente equivalente ao comando único acima.
ADD PRIMARY KEY
também cria uma NOT NULL
restrição (testada no postgres 9.3) conforme o esperado e desejado.
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
É tudo o que você precisa:
id
colunaÉ dado crédito a @resnyanskiy, que deu essa resposta em um comentário.
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Para usar uma coluna de identidade na v10,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
Para obter uma explicação das colunas de identidade, consulte https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Para a diferença entre GERADO POR PADRÃO e GERADO SEMPRE, consulte https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ .
Para alterar a sequência, consulte https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .
SQL Error [23502]: ERROR: column "id" contains null values
Eu cheguei aqui porque estava procurando por algo assim também. No meu caso, eu estava copiando os dados de um conjunto de tabelas temporárias com muitas colunas em uma tabela e também atribuindo IDs de linha à tabela de destino. Aqui está uma variante das abordagens acima que eu usei. Eu adicionei a coluna serial no final da minha tabela de destino. Dessa forma, não preciso ter um espaço reservado para ele na instrução Insert. Em seguida, uma simples seleção * na tabela de destino preencheu automaticamente esta coluna. Aqui estão as duas instruções SQL que eu usei no PostgreSQL 9.6.4.
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;