PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Peningkatan otomatis, tetapi hilangkan nilai yang ada di kolom

Pembaruan:Nanti, jawaban yang lebih detail:

Ini akan bekerja dengan lancar:

CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT 1 FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$  LANGUAGE plpgsql VOLATILE;

Loop mengambil nomor berikutnya dari urutan yang diberikan sampai ditemukan yang belum ada di tabel. Bahkan harus aman untuk penggunaan bersamaan , karena kita masih mengandalkan urutan.

Gunakan fungsi ini di kolom default dari kolom serial (mengganti default untuk kolom serial nextval('t1_id_seq'::regclass) :

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

Panduan tentang lastval() .

Ini berkinerja baik dengan beberapa pulau dan banyak celah (yang tampaknya menjadi kasus menurut contoh). Untuk menegakkan keunikan, tambahkan batasan unik (atau kunci utama) pada kolom.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django Postgresql menjatuhkan default kolom saat bermigrasi

  2. Menyetel batas waktu koneksi dengan PDO

  3. Bagaimana cara memasukkan HashMap ke PostgreSQL sebagai tipe JSON?

  4. Aplikasi Boot Musim Semi. Batch tidak berfungsi dalam metode JpaRepository.saveAll

  5. sql ORDER BY beberapa nilai dalam urutan tertentu?