Saya mencoba mengatur urutan ke nilai tertentu.
SELECT setval('payments_id_seq'), 21, true
Ini memberikan kesalahan:
ERROR: function setval(unknown) does not exist
Menggunakan ALTER SEQUENCE
sepertinya juga tidak berhasil?
ALTER SEQUENCE payments_id_seq LASTVALUE 22
Bagaimana ini bisa dilakukan?
Ref: https://www.postgresql.org/docs/current/static/functions- berikutnyaence.html
postgresql
database-sequence
Stefan
sumber
sumber
setval()
paling tidak ada dua argumen.Jawaban:
Tanda kurung salah tempat:
Kalau tidak, Anda menelepon
setval
dengan satu argumen, sementara itu membutuhkan dua atau tiga.sumber
true
berarti bahwa nilai berikutnya adalah angka yang diberikan +1, dalam hal ini 22.false
berarti nilai berikutnya adalah angka yang disediakan, atau 21. Secara default, setval akan berperilaku seolah-olahtrue
telah dipilih. Lebih detail: postgresql.org/docs/9.6/static/functions- berikutnyaence.htmlselect setval
sintaks lebihalter sequence
adalah bahwa Anda dapat menggunakan kueri bersarang di dalamnya, misalnya untukselect max(id) from payments
.Sintaks ini tidak valid dalam versi PostgreSQL apa pun :
Ini akan berhasil:
dan setara dengan:
Lebih banyak di manual saat ini untuk
ALTER SEQUENCE
dan fungsi urutan .Catatan yang
setval()
mengharapkan salah satu(regclass, bigint)
atau(regclass, bigint, boolean)
. Dalam contoh di atas saya menyediakan literal yang belum diketik . Itu juga berhasil. Tetapi jika Anda memasukkan variabel yang diketik ke fungsi, Anda mungkin perlu cetakan tipe eksplisit untuk memenuhi resolusi tipe fungsi. Suka:Untuk operasi berulang Anda mungkin tertarik pada:
START [WITH]
menyimpanRESTART
nomor default , yang digunakan untukRESTART
panggilan berikutnya tanpa nilai. Anda memerlukan Postgres 8.4 atau lebih baru untuk bagian terakhir.sumber
ALTER SEQUENCE [sequence] RESTART WITH (SELECT MAX(col) from table);
tidak bekerja, sedangkanSELECT setval('sequence', (SELECT (MAX(col) from table), TRUE);
bekerja. Saya mendapatkan kesalahan sintaksis. (Postgres 9.4)SELECT setval('sequence', (SELECT MAX(col) from table), TRUE);
jika orang tua Anda tidak berbaris.SELECT setval('seq', max(col)) FROM tbl;
Lihat: stackoverflow.com/a/23390399/939860Menggunakan
select setval('payments_id_seq', 21, true);
setval
berisi 3 parameter:sequence_name
nextval
Penggunaan true atau false pada parameter ke-3 dari setval adalah sebagai berikut:
Cara yang lebih baik untuk menghindari pengkodean nama urutan, nilai urutan berikutnya dan untuk menangani tabel kolom kosong dengan benar, Anda dapat menggunakan cara di bawah ini:
di mana
table_name
nama tabel,id
adalahprimary key
tabelsumber
sumber
Saya tidak mencoba mengubah urutan melalui
setval
. Tetapi dengan menggunakanALTER
saya dikeluarkan bagaimana menulis nama urutan dengan benar. Dan ini hanya bekerja untuk saya:Periksa nama urutan yang diperlukan menggunakan
SELECT * FROM information_schema.sequences;
ALTER SEQUENCE public."table_name_Id_seq" restart {number};
Dalam kasus saya itu
ALTER SEQUENCE public."Services_Id_seq" restart 8;
sumber