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 di Postgres:datetime
- Mengabaikan zona waktu sama sekali di Rails dan PostgreSQL
Dan Anda hanya perlu menyimpan previous_address
(atau lebih detail), bukan , atau address
. Keduanya akan menjadi mubazir dalam model data yang waras.original_address