Postgreslerde otomatik artış sayacını sıfırla


232

Bir tablonun otomatik artış alanını bazı değerlere zorlamak istiyorum, bunu denedim:

ALTER TABLE product AUTO_INCREMENT = 1453

VE

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

Ben postgres yeniyim :(

Ve alanlı bir masam productvarIdname


5
Eğer yeniyse, pgAdmin'i neden kullanmaz ve üreteceği komutları denetler?
mantıksızlık

1
Genellikle tablolar "ürün" olarak değil "ürün" olarak adlandırılır.Bu durumda
diziniz "ürünler_kimliği_seq

Yanıtlar:


309

Tabloyu productbir idsütunla oluşturduysanız, sıra basit olarak çağrılmaz product, aksine product_id_seq(yani ${table}_${column}_seq) olarak adlandırılır.

Bu, ALTER SEQUENCEihtiyacınız olan komuttur:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

\dsPsql komutunu kullanarak veritabanınızdaki dizileri görebilirsiniz . \d productSütununuz için varsayılan kısıtlamayı yapar ve bakarsanız, nextval(...)çağrı sıra adını da belirtir.


66
Bu mesajdan doğru sözdiziminin ne olduğu açık değildir. Bu: ALTER SEQUENCE product_id_seq 1453 İLE RESTART;
Liron Yahdav

7
Yukarıdakileri kötü bir şekilde ayrıştırdığım için, işte aynı şeyi yeniden düzenlemenin yolu. Sözdizimi ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, burada "seq" değişmez metindir ve # için bir sayı koyarsınız. Alt çizgileri ihmal etmeyin. :-)
kmort

2
Genel şema kullanılmıyorsa my_schema ile ön ek yapmanız gerektiğini lütfen unutmayın. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L.VanDenBosch

Neden ALTER SEQUENCE product_id_seq RESTART WITH (üründen SELECT MAX (id)); Çalışmıyor mu? Bulduğum tek yol iki ayrı sorgu kullanmak.
Chris Huang-Leaver

8
Yeniden başlattığınız değerin, kullanmak istediğiniz bir sonraki değer olduğunu unutmayın. Yani zaten id ile bir kayıt 1453varsa, gerekir RESTART WITH 1454.
hughes

144

Aradığınız, ürün tablosu için sıralamanızın product_id_seq olduğunu varsayalım:

ALTER SEQUENCE product_id_seq 1453 İLE RESTART;


130

Aşağıdaki komut bunu sizin için otomatik olarak yapar: Bu işlem tablodaki tüm verileri de siler. Yani dikkatli ol.

TRUNCATE TABLE someTable RESTART IDENTITY;

21
Dikkat - bu tüm verilerinizi de
silecektir

28
@Loolooii, Sadece işaretliyor; SQL'e aşina olmayan biri burada arama yapıyorsa, çünkü otomatik olarak otomatik alanı olan bir tabloya bir satır eklediler (örneğin bir ORM aracılığıyla), o zaman bu çözüm muhtemelen bekledikleri şey değildir.
kibibu

1
TABLEAnahtar kelime gereksizdir. TRUNCATE someTable RESTART IDENTITY;yeterlidir.
user1

CASCADE ile bunu nasıl yapacağım hakkında bir fikrin var mı?
ihossain

2
@ihossain denediniz TRUNCATE someTable RESTART IDENTITY CASCADE;mi?
Vedran

55

Dizi sayacını ayarlamak için:

setval('product_id_seq', 1453);

Sıra adını bilmiyorsanız şu pg_get_serial_sequenceişlevi kullanın :

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

Parametreler tablo adı ve sütun adıdır.

Ya da sadece bir sorunu \d producten psqlistemi:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

14

- Dizinin başlangıç ​​değerini değiştirin

ALTER SEQUENCE project_id_seq RESTART 3000;

Aynı ama dinamik:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));

Bir SELECT'in kullanımının rahatsız edici olduğunu kabul ediyorum ama işe yarıyor.

Kaynak: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment


Yanılmıyorsam, PG sıralarını last_value ile temsil eder ve is_called, (1, false), sonra (1, true), (2, true) ile başlar ... böylece MAX (id) + 1 MAX olmalıdır (id) yerine bir kimliği atlamayın.
On

Bunun için postgres örneğimi de yeniden başlatmam gerekiyordu. brew services restart postgresql
BigRon

SELECT SETVAL ('proje_kimliği_seq', (SELECT MAX (id) + 1 FROM proje)); Mükemmel çalışıyor Ancak artış değerini 0 olarak sıfırlamanın bir yolu var mı? Yani yeni girişler 0 diziniyle başlıyor mu?
Charith Jayasanka

13

Ziyaretçinin rahatı için yorumdan dönüştürüldü

Bu mesajdan doğru sözdiziminin ne olduğu açık değildir. Bu:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

6

GUI'den otomatik artışı sıfırlamak istiyorsanız bu adımları izleyin.

  1. Senin git Veritabanı
  2. Herkese Açık'ı tıklayın
  3. Tablolar Listeleme sayfasında 'Tablolar', 'Görünümler', 'Diziler' gibi Sekmeler'i görebilirsiniz .
  4. Dizileri tıklayın
  5. 'Sekanslar'ı tıkladığınızda tüm Sekans Listesini görebilirsiniz, Sıfırlamak istediğiniz herhangi bir sekmeyi tıklayın
  6. Bundan sonra 'Alter', 'Set Value', 'Restart', 'Reset' vb.
  7. ardından Sıfırla'yı tıklayın , ardından bir Yeni Satır ekleyin.

6

Sonraki değeri sıfırlamak istediğiniz KİMLİK sütununa sahip bir tablonuz varsa, aşağıdaki komutu kullanabilirsiniz:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

1
Bir + kullanılabilirlik için hayır sequenceveya tabloyu kesemez. Bence en iyi cevap
ABS

5

Otomatik artışı artırmak için aşağıdaki sorguyu kullanarak sıra adınızı almanız gerekir.

Sözdizimi:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Misal:

SELECT pg_get_serial_sequence('demo', 'autoid');

Sorgu, autoid'in sıra adını "Demo_autoid_seq" olarak döndürür. Ardından autoid'i sıfırlamak için aşağıdaki sorguyu kullanın

Sözdizimi:

ALTER SEQUENCE sequenceName RESTART WITH value;

Misal:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

3

Dizi kimliği kullanımı almak için

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

Bu size sequece id değerini tableName_ColumnName_seq olarak verir

Son tohum numarasını almak için

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

veya dizi kimliğini zaten biliyorsanız doğrudan kullanın.

select currval(tableName_ColumnName_seq);

Size son tohum numarasını verecektir

Tohum numarasını sıfırlamak için

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

1

Şema ve Tablo ile Sıra Anahtarı'nın ne olduğunu kontrol etmek için bu sorguyu kullanın ,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Bu sorgu artış artış değerini birer birer kullanın,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

Tabloya eklenirken, bir sonraki artan değer anahtar (111) olarak kullanılacaktır.

Belirli bir değeri artan değer olarak ayarlamak için bu sorguyu kullanın

SELECT setval('"SchemaName"."SequenceKey"', 120);

Tabloya eklenirken, bir sonraki artan değer anahtar (121) olarak kullanılacaktır.


0

'_' İle tablo adınız varsa, sıra adıyla kaldırıldığını unutmayın.

Örneğin, tablo adı: user_tokens sütunu: id Sıra adı: usertokens_id_seq

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.