PostgreSQL'de otomatik arttırma birincil anahtarı nasıl ayarlanır?


259

PostgreSQL 22 sütun içeren bir tablo var ve bir otomatik artış birincil anahtar eklemek istiyorum.

idBIGSERIAL türü adlı bir sütun oluşturmaya çalıştım ama pgadmin bir hatayla yanıt verdi:

ERROR: sequence must have same owner as table it is linked to.

Herkes bu sorunu nasıl düzeltebilir biliyor mu? Tabloyu yeniden oluşturmadan PostgreSQL'de otomatik olarak artan bir birincil anahtar oluşturmayı nasıl eklerim?

Yanıtlar:


292

Bu komutu deneyin:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Tabloyu oluşturduğunuz DB kullanıcısıyla deneyin .


75
(buradaki anahtar, sahnelerin ve artışların arkasında bir sıra oluşturan / ekleme zamanında kullanan bir SERIAL veya BIGSERIAL veri türü kullanmaktır)
rogerdpack

16
ve buna başka bir tablodan başvurmak istiyorsanız, tamsayı veya bigint kullanın
Ward,

2
@satishkilari: evet, sözdizimi ALTER TABLE mytable ADD PRIMARY KEY (column);. Postgresql sütunun NULL içermediğini kontrol eder.
AH

3
PgAdmin 4. Hem bu hatayı alma bigserialve serialaynı hatayı veriyor:ERROR: syntax error at or near "BIGSERIAL"
adi

5
Ayrıca bigserial veya seri kullanarak sözdizimi hatası alıyorum. Bunun için minimum postgresql sürümü var mı?
dacDave

251

Postgresql'de birincil anahtarı otomatik olarak arttırma:

1. Adım, tablonuzu oluşturun:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

Adım 2, değerleri tablonuza böyle ekleyin, ilk parametre listesinde mytable_key öğesinin belirtilmediğine dikkat edin, bu varsayılan dizinin otomatik artmasına neden olur.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

3. Adım, tablonuzdan * seçin:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Adım 4, çıktıyı yorumlayın:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

Mytable_key sütununun otomatik olarak artırıldığını gözlemleyin.

PROTIP:

Postgresql dahili olarak ekleme, silme, güncelleme ve seçme hızlarını artırmak için karma tablo yapılarını kullandığından, tablonuzda her zaman birincil anahtar kullanmalısınız. Birincil anahtar sütunu (benzersiz ve boş olmayan bir şekilde zorunludur) mevcutsa, karma işlevi için benzersiz bir tohum sağlamaya bağlı olabilir. Birincil anahtar sütunu yoksa, anahtar olarak başka bir sütun kümesini seçtiği için karma işlevi verimsiz hale gelir.


21
Küçük bir nitpick, perde arkasında SERIALbir sequencearka plan yaratır : postgresql.org/docs/9.2/static/…
karbokasyon

1
yeni bir sütun eklemeden bir tabloda birincil anahtar (mevcut sütun) yapmak mümkün
satish kilari

yabancı anahtar thing_id int references epictable(mytable_key)çalışma ile ilan edilecek mi?

36

Özel bir sıra kullanarak postgresql'de otomatik artan bir birincil anahtar oluşturun:

1. Adım, dizinizi oluşturun:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

2. Adım, tablonuzu oluşturun

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

3. Adım, tablonuza yerleştirin

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

4. Adım, satırları gözlemleyin

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

İki satır, diziden tanımlandığı gibi 1 ile başlayan ve 1 ile artan anahtarlara sahiptir.

Bonus Elite ProTip:

Programcılar yazmaktan ve nefret etmekten nefret eder nextval('splog_adfarm_seq'). Bunun DEFAULTyerine bu parametre için şunu yazabilirsiniz :

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

Yukarıdakilerin çalışması için, splog_adfarm tablosundaki o anahtar sütun için varsayılan bir değer tanımlamanız gerekir. Hangisi daha güzel.


2
Özel sekansların faydaları nelerdir? Muhtemelen güvenlik?
Léo Léopold Hertz 준영

1
@Masi Özel bir sekansın kullanımı, master-master çoğaltma yapılmasını kolaylaştırmak olabilir - ki bu iki veri merkezi arasındaki veri bağlantısı kopmuşsa faydalı olur - farklı kimliğe sahip her iki sunucuda da kayıtların oluşturulmasına izin verir. sonra ayrı yerlerde oluşturulan kimlikleri tutarken veritabanlarının yedeklenmesini kolaylaştırır.
Vincent McNabb

16

Bunu pgadmin'de yapmak istiyorsanız, çok daha kolaydır. Postgressql'de, bir sütuna otomatik artış eklemek için önce bir otomatik artış sırası oluşturmamız ve bunu gerekli sütuna eklememiz gerekir. Bunu beğendim.

1) Öncelikle tablonuz için birincil anahtar olduğundan emin olmanız gerekir. Ayrıca birincil anahtarın veri türünü bigint veya smallint'te tutun. (Ben bigint kullandım, başka bir yerde diğer cevaplarda belirtildiği gibi seri adı verilen bir veri türü bulamadım)

2) Ardından sekansı sağ tıklatarak bir sekans ekleyin-> yeni sekans ekle . Tabloda veri yoksa, sırayı olduğu gibi bırakın, değişiklik yapmayın. Sadece kurtar. Mevcut veriler varsa, birincil anahtar sütunundaki son veya en yüksek değeri aşağıda gösterildiği gibi Tanımlar sekmesindeki Geçerli değere ekleyin. resim açıklamasını buraya girin

3) Son olarak, satırı nextval('your_sequence_name'::regclass)aşağıdaki gibi birincil anahtarınızdaki Varsayılan değerine ekleyin.

resim açıklamasını buraya girin Burada sıra adının doğru olduğundan emin olun. Hepsi bu ve otomatik artış işe yarayacak.


9

Bir dizideki sayıları kullanmak istiyorsanız, aşağıdakine benzer yeni bir dizi tanımlayın

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

ve sonra id için sıra kullanmak üzere tabloyu değiştirin:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

Her tablo için yeni bir sıra oluşturmam gerekiyor mu?
Bharat Chhabra

Farklı tablolar için aynı sırayı paylaşabilirsiniz, ancak sıra her tablodaki her kayıt için artacaktır.
acaruci

1

PostgreSQL'de birincil anahtarı otomatik olarak artırmak için aşağıdaki komut dosyasını denedim.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);

DÜZENLE:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

SERIAL anahtar kelimesi otomatik olarak ilgili sütun için bir sıra oluşturur.


Yine de bir SIRALAMA için yaptığınız gibi bir SERİ'yi sıfırlayabilir misiniz?
thoroc

1
Evet!, Kontrol ettim ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;ve çalışıyor.
Asad Shakeel

0

Belki bu soruyu cevaplamak için biraz geç kaldım, ama işimde bu konuda çalışıyorum :)

'A_code' = c1, c2, c3, c4 sütununu yazmak istedim ...

Öncelikle adı ref_idve türü olan bir sütun açtım serial. Sonra bu komutla sorunumu çözdüm:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 

yeni bir sütun eklemeden bir tabloda birincil anahtar (mevcut sütun) yapmak mümkün
satish kilari
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.