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