Yanıtlar:
( Güncellendi - Yorum yapan kişilere teşekkürler )
test1
Otomatik artan, birincil anahtar id
(vekil) sütunu eklemek istediğiniz adlı bir tablonuz olduğunu varsayalım . PostgreSQL'in son sürümlerinde aşağıdaki komut yeterli olmalıdır:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
PostgreSQL'in eski sürümlerinde (8.x'ten önce?) Tüm kirli işleri yapmak zorundaydınız. Aşağıdaki komut dizisi hile yapmalıdır:
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');
Yine, Postgres'in son sürümlerinde bu, yukarıdaki tek komutla kabaca eşdeğerdir.
ADD PRIMARY KEY
Ayrıca NOT NULL
beklenen ve istendiği gibi bir sınırlama (postgres 9.3'te test edilmiştir) oluşturduğunu unutmayın .
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
Tüm yapmanız gereken bu:
id
Sütunu ekleBu cevabı bir yorumda veren @resnyanskiy'e kredi verildi.
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
V10'da bir kimlik sütunu kullanmak için,
ALTER TABLE test
ADD COLUMN id { int | bigint | smallint}
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY;
Kimlik sütunlarının açıklaması için bkz. Https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
VARSAYILAN TARAFINDAN OLUŞTURULAN ve HER ZAMAN OLUŞTURULANLAR arasındaki fark için bkz. Https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ .
Diziyi değiştirmek için bkz. Https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .
SQL Error [23502]: ERROR: column "id" contains null values
Buraya indim çünkü ben de böyle bir şey arıyordum. Benim durumumda, hedef tabloya satır kimlikleri atarken birçok sütun içeren bir hazırlama tabloları kümesinden veri kopyalıyordum. Yukarıda kullandığım yaklaşımların bir varyantı. Hedef sütununun sonuna seri sütunu ekledim. Bu şekilde Insert deyiminde bunun için bir yer tutucum olması gerekmez. Ardından hedef tabloya basit bir seçim * bu sütunu otomatik olarak doldurdu. İşte PostgreSQL 9.6.4 üzerinde kullandığım iki SQL deyimi.
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;