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

Nomor seri per grup baris untuk kunci majemuk

Jangan. Sudah dicoba berkali-kali dan sakit.

Gunakan serial plain atau IDENTITY kolom:

  • Kolom tabel kenaikan otomatis
CREATE TABLE address_history (
  address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);

Gunakan fungsi jendela row_number() untuk mendapatkan nomor seri tanpa celah per person_id . Anda dapat mempertahankan VIEW yang dapat Anda gunakan sebagai pengganti drop-in untuk tabel Anda dalam kueri untuk menyiapkan nomor tersebut:

CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
                             ORDER BY address_history_id) AS adr_nr
FROM   address_history;

Lihat:

  • Urutan tanpa celah di mana banyak transaksi dengan beberapa tabel terlibat

Atau Anda mungkin ingin ORDER BY sesuatu yang lain. Mungkin created_at ? created_at, address_history_id yang lebih baik untuk memutuskan ikatan yang mungkin. Jawaban terkait:

  • Kolom dengan serial alternatif

Juga, tipe data yang Anda cari adalah timestamp atau timestamptz , bukan datetime di Postgres:

  • Mengabaikan zona waktu sama sekali di Rails dan PostgreSQL

Dan Anda hanya perlu menyimpan previous_address (atau lebih detail), bukan address , atau original_address . Keduanya akan menjadi mubazir dalam model data yang waras.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana justify_interval() Bekerja di PostgreSQL

  2. Bagaimana cara menegakkan keunikan seperti set di antara beberapa kolom?

  3. Menggabungkan nilai JSONB di PostgreSQL?

  4. Status Manajemen Cadangan Sumber Terbuka Saat Ini untuk PostgreSQL

  5. Mendapatkan nama fungsi saat ini di dalam fungsi dengan plpgsql