Postgres diziyi manuel olarak değiştirir


189

Belirli bir değere bir dizi ayarlamak çalışıyorum.

SELECT setval('payments_id_seq'), 21, true

Bu bir hata verir:

ERROR: function setval(unknown) does not exist

Kullanmak ALTER SEQUENCEda işe yaramıyor gibi görünüyor mu?

ALTER SEQUENCE payments_id_seq LASTVALUE 22

Bu nasıl yapılabilir?

Ref: https://www.postgresql.org/docs/current/static/functions-sequence.html


4
Görünüşe göre setval()en az iki argüman var.

Yanıtlar:


262

Parantezler yanlış yerleştirilmiş:

SELECT setval('payments_id_seq', 21, true);  # next value will be 22

Aksi takdirde setval, tek bir argümanla çağırırsınız, ancak iki veya üç gerektirir.


2
Son "doğru" argümanı ne anlama geliyor?
inafalcao

15
truebir sonraki değerin sağlanan + 1 falseolacağı anlamına gelir, bu durumda 22. bir sonraki değerin verilen sayı veya 21 olacağı anlamına gelir. Varsayılan olarak, setval trueseçilmiş gibi davranacaktır . Daha fazla detay: postgresql.org/docs/9.6/static/functions-sequence.html
Tom Mertz

1
select setvalsözdiziminin bir avantajı da içinde alter sequenceiç içe sorguları kullanabilmenizdir select max(id) from payments.
mariotomo

187

Bu sözdizimi PostgreSQL'in hiçbir sürümünde geçerli değildir :

ALTER SEQUENCE payments_id_seq LASTVALUE 22

Bu işe yarar:

ALTER SEQUENCE payments_id_seq RESTART WITH 22;

ve şuna eşittir:

SELECT setval('payments_id_seq', 22, FALSE);

Ve dizi fonksiyonları için mevcut kılavuzda daha fazlasıALTER SEQUENCE .

Not setval()bekler ya (regclass, bigint)ya (regclass, bigint, boolean). Yukarıdaki örnekte türlenmemiş değişmez değerler sağlıyorum . Bu da işe yarıyor. Ancak, işleve yazılan değişkenleri beslerseniz , işlev türü çözünürlüğünü karşılamak için açık tür kalıplarına ihtiyacınız olabilir . Sevmek:

SELECT setval(my_text_variable::regclass, my_other_variable::bigint, FALSE);

Tekrarlanan işlemler için ilginizi çekebilir:

ALTER SEQUENCE payments_id_seq START WITH 22; -- set default
ALTER SEQUENCE payments_id_seq RESTART;       -- without value

START [WITH] varsayılanı saklar RESTARTRESTARTdeğeri olmayan sonraki aramalar için kullanılan numarayı . Son bölüm için Postgres 8.4 veya daha yenisine ihtiyacınız var.


4
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);çalışmıyor, oysa SELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);çalışıyor. Bir sözdizimi hatası alıyorum. (Postgres 9.4)
NuclearPeon

1
DDL komutunda alt sorguya izin verilmiyor ("yardımcı program komutu"). Bkz. Stackoverflow.com/a/36025963/939860
Erwin Brandstetter

1
@MitalPritmani: Yayın türüne ihtiyacınız olabilir. Yukarıdaki ek talimatları göz önünde bulundurun.
Erwin Brandstetter

1
@NuclearPeon Sanırım SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);aksi halde ebeveynleriniz sıraya girmiyor .
dland

1
@dland: Kenara: daha kısa ve daha hızlı eşdeğeri: SELECT setval('seq', max(col)) FROM tbl;Bkz: stackoverflow.com/a/23390399/939860
Erwin Brandstetter

33

kullanım select setval('payments_id_seq', 21, true);

setval 3 parametre içerir:

  • 1. parametre sequence_name
  • 2. parametre Sonraki nextval
  • 3. parametre isteğe bağlıdır.

Setval'in 3. parametresinde true veya false kullanımı aşağıdaki gibidir:

SELECT setval('payments_id_seq', 21);           // Next nextval will return 22
SELECT setval('payments_id_seq', 21, true);     // Same as above 
SELECT setval('payments_id_seq', 21, false);    // Next nextval will return 21

Dizi adının, bir sonraki dizi değerinin sabit kodlamasını önlemenin ve boş sütun tablosunu doğru işlemenin en iyi yolu, aşağıdaki yolu kullanabilirsiniz:

SELECT setval(pg_get_serial_sequence('table_name', 'id'), coalesce(max(id), 0)+1 , false) FROM table_name;

nerede table_nametablonun adıdır idolan primary keytablonun


Teşekkür ederim! Son ifade tam da aradığım şeydi. Daha sonra toplu olarak eklemek için dizi değerlerini ayırmamı sağlar.
Timur


0

Sıralamayı değiştirmeyi denemiyorum setval. Ama ALTERben kullanarak dizi adı düzgün yazmak için nasıl verildi. Ve bu sadece benim için çalışıyor:

  1. Gerekli sıra adını kontrol edin SELECT * FROM information_schema.sequences;

  2. ALTER SEQUENCE public."table_name_Id_seq" restart {number};

    Benim durumumda ALTER SEQUENCE public."Services_Id_seq" restart 8;

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.