PostgreSQL'de varolan bir tabloya otomatik artan birincil anahtar nasıl eklenir?


Yanıtlar:


355

( Güncellendi - Yorum yapan kişilere teşekkürler )

PostgreSQL'in Modern Sürümleri

test1Otomatik 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;

Eski Sürümler PostgreSQL

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.


3
ORACLE kullanıyorum, bu yüzden paylaşmak ORACLE çocuklar için yararlı olabilir ORACLE: ALTER TABLE TEST1 ADD ID NUMBER; GÜNCELLEME TESTİ1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1 PRİMER ANAHTAR EKLE (ID); UPDATE deyimini çalıştırmadan önce bir TEST1_SEQ Dizisi oluşturun
msbyuva

ADD PRIMARY KEYAyrıca NOT NULLbeklenen ve istendiği gibi bir sınırlama (postgres 9.3'te test edilmiştir) oluşturduğunu unutmayın .
Jared Beck

19
Postgres'te tek bir komut kullanabilirsinizALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
resnyanskiy

1
@ Resnyanskiy'nin yorumuna ek olarak, tabloda veri olsa bile bu işe yarar. Kimlikler doldurulur ve boş sınır ayarlanmamıştır. Tüm yanıtın yerini bu açıklamadaki satır alabilir.
Synesso

1
@EricWang Teşekkürler Eric, haklısın - bunun birkaç yıl önce işe yaramadığına inanıyorum, ama emin değilim. Cevabı topluluk-wikiye dönüştürdü.
leonbloy

57
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Tüm yapmanız gereken bu:

  1. idSütunu ekle
  2. Saymak için 1'den bir dizi ile doldurun (*).
  3. Birincil anahtar olarak ayarlayın / null değil.

Bu cevabı bir yorumda veren @resnyanskiy'e kredi verildi.


2
Bu cevap olarak işaretlenmeli ve cevap @resnyanskiy
Eric Wang'a

Önce pkey'i bırakıp bunu çalıştırmam gerekti. ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Josh Robertson

10

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


: Bu çözüm sorun tablo zaten satır içeriyorsa o zaman bir hata alıyorum olmasıdırSQL Error [23502]: ERROR: column "id" contains null values
isapir

3
@isapir: İlk sürümlerde (pg 10 ve 10.1) bu hatayı üreten bir hata oluştu. Pg 10.2 ile düzeltildi. Ayrıntılar burada: dba.stackexchange.com/q/200143/3684
Erwin Brandstetter

Thanks @ erwin-brandstetter
isapir

Bir yıl sonra yine bu cevabı buldum, hata görünüşte düzeltildi, düzeltildi;)
isapir

2

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.