Setel ulang penghitung kenaikan otomatis di postgres

232

Saya ingin memaksa bidang kenaikan otomatis tabel ke beberapa nilai, saya mencoba dengan ini:

ALTER TABLE product AUTO_INCREMENT = 1453

DAN

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

Saya baru di postgres :(

Saya punya meja productdengan Iddan namebidang

Rad
sumber
5
Jika baru mengapa tidak menggunakan pgAdmin dan memeriksa perintah yang akan dihasilkannya?
Unreason
1
Biasanya tabel diberi nama seperti 'produk "dan bukan seperti" produk ". Dalam hal ini urutan Anda akan dinamai seperti" products_id_seq ". Pastikan Anda mencari urutan yang benar.
Alexander Gorg

Jawaban:

309

Jika Anda membuat tabel productdengan idkolom, maka urutannya tidak hanya disebut product, melainkan product_id_seq(yaitu, ${table}_${column}_seq).

Ini adalah ALTER SEQUENCEperintah yang Anda butuhkan:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

Anda dapat melihat urutan dalam database Anda menggunakan \dsperintah di psql. Jika Anda melakukannya \d productdan melihat batasan default untuk kolom Anda, nextval(...)panggilan akan menentukan nama urutan juga.

araqnid
sumber
66
Dari pesan ini tidak jelas apa sintaks yang benar. Itu adalah: ALTER SEQUENCE product_id_seq RESTART DENGAN 1453;
Liron Yahdav
7
Hanya karena saya parsing di atas buruk, inilah cara saya menyatakan kembali hal yang sama persis. Sintaksnya adalah ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #, di mana "seq" adalah teks literal, dan Anda memasukkan angka untuk #. Jangan abaikan garis bawah. :-)
kmort
2
Harap dicatat bahwa jika tidak menggunakan skema publik, ia perlu diawali dengan my_schema. ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
Daniel L. VanDenBosch
Adakah yang tahu mengapa ALTER SEQUENCE product_id_seq RESTART WITH (SELECT MAX (id) dari produk); Tidak bekerja Satu-satunya cara saya temukan adalah menggunakan dua kueri yang terpisah.
Chris Huang-Leaver
8
Perhatikan bahwa nilai yang Anda mulai ulang adalah nilai berikutnya yang ingin Anda gunakan. Jadi, jika Anda sudah memiliki catatan dengan id 1453, Anda harus melakukannya RESTART WITH 1454.
hughes
144

Ini adalah perintah yang Anda cari, dengan asumsi urutan Anda untuk tabel produk adalah product_id_seq:

ALTER SEQUENCE product_id_seq RESTART DENGAN 1453;

matt snider
sumber
130

Perintah berikut melakukan ini secara otomatis untuk Anda: Ini juga akan menghapus semua data dalam tabel. Jadi berhati-hatilah.

TRUNCATE TABLE someTable RESTART IDENTITY;
Loolooii
sumber
21
Hati-hati - ini juga akan menghapus semua data Anda
kibibu
28
@Loolooii, Baru saja menandai; jika seseorang yang tidak terbiasa dengan SQL mencari di sini karena mereka secara manual menambahkan baris ke tabel dengan bidang autoincrement (misalnya, melalui ORM), maka solusi ini mungkin bukan yang mereka harapkan.
kibibu
1
Kata TABLEkunci tersebut berlebihan. TRUNCATE someTable RESTART IDENTITY;cukup.
pengguna1
Adakah yang tahu bagaimana saya akan melakukan ini dengan CASCADE?
ihossain
2
@ semuanya sudah coba TRUNCATE someTable RESTART IDENTITY CASCADE;?
Vedran
55

Untuk mengatur penghitung urutan:

setval('product_id_seq', 1453);

Jika Anda tidak tahu nama urutannya gunakan pg_get_serial_sequencefungsi:

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

Parameternya adalah nama tabel dan nama kolom.

Atau cukup kirimkan \d productsaat psqldiminta:

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

- Ubah nilai awal dari urutan

ALTER SEQUENCE project_id_seq RESTART 3000;

Sama tetapi dinamis:

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

Saya setuju bahwa penggunaan SELECT mengganggu tetapi berhasil.

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

Wiwwil
sumber
Jika saya tidak salah, PG mewakili urutan mereka dengan last_value dan is_called, dimulai pada (1, false), lalu (1, true), (2, true) ... jadi MAX (id) + 1 harus MAX (id) sebagai gantinya untuk tidak melewatkan id.
Sepuluh
Saya juga harus me-restart instance postgres saya agar ini berfungsi. brew services restart postgresql
BigRon
SELECT SETVAL ('project_id_seq', (SELECT MAX (id) + 1 FROM project)); Bekerja dengan baik Tetapi apakah ada cara untuk mereset nilai kenaikan menjadi 0. Jadi entri baru dimulai dengan indeks 0?
Charith Jayasanka
13

Dikonversi dari komentar demi kenyamanan pengunjung

Dari pesan ini tidak jelas apa sintaks yang benar. Ini:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Anwar
sumber
6

jika Anda ingin Atur ulang kenaikan otomatis dari GUI, kemudian ikuti langkah-langkah ini.

  1. Pergi ke Database Anda
  2. Klik Publik
  3. di halaman Daftar Tabel Anda dapat melihat TABS seperti 'Tabel', 'Tampilan', 'Urutan' seperti itu.
  4. Klik pada Urutan
  5. ketika Anda mengklik 'Urutan' Anda dapat melihat semua Daftar Urutan, klik pada apa pun yang ingin Anda Atur Ulang
  6. Setelah itu Anda dapat melihat beberapa pilihan seperti 'Alter', 'Set Value', 'Restart', 'Reset' dll ...
  7. kemudian klik Reset , lalu tambahkan satu Baris Baru.
Chaudhary
sumber
6

Jika Anda memiliki tabel dengan kolom IDENTITY yang ingin Anda setel ulang nilai selanjutnya, Anda dapat menggunakan perintah berikut:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;
BrianB
sumber
1
Satu + untuk kegunaan jika tidak ada sequenceatau Anda TIDAK dapat memotong tabel. Saya pikir itu jawaban terbaik
ABS
5

Untuk mengatur ulang kenaikan otomatis, Anda harus mendapatkan nama urutan dengan menggunakan kueri berikut.

Sintaksis:

SELECT pg_get_serial_sequence(‘tablename’,  columnname‘);

Contoh:

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

Permintaan akan mengembalikan nama urutan autoid sebagai "Demo_autoid_seq" Kemudian gunakan permintaan berikut untuk mengatur ulang autoid

Sintaksis:

ALTER SEQUENCE sequenceName RESTART WITH value;

Contoh:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
Vinoth Shankar
sumber
3

Untuk mendapatkan urutan id, gunakan

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

Ini akan memberi Anda id sequesce sebagai tableName_ColumnName_seq

Untuk Mendapatkan Nomor Terakhir, gunakan

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

atau jika Anda tahu urutan id sudah menggunakannya secara langsung.

select currval(tableName_ColumnName_seq);

Ini akan memberi Anda nomor benih terakhir

Untuk Reset gunakan nomor seed

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
Raja A
sumber
1

Gunakan kueri ini untuk memeriksa apa Kunci Urutan dengan Skema dan Tabel,

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

Gunakan kueri ini untuk meningkatkan nilai satu per satu,

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

Saat memasukkan ke tabel, nilai tambahan berikutnya akan digunakan sebagai kunci (111).

Gunakan kueri ini untuk menetapkan nilai spesifik sebagai nilai yang ditambahkan

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

Saat memasukkan ke tabel, nilai tambahan berikutnya akan digunakan sebagai kunci (121).

Thushara Buddhika
sumber
0

Perhatikan bahwa jika Anda memiliki nama tabel dengan '_', itu dihapus dalam nama urutan.

Misalnya, nama tabel: kolom user_tokens: id Nama urutan: usertokens_id_seq

abby
sumber