しないでください。それは何度も試されており、それは苦痛です。
プレーンなserial
を使用する またはIDENTITY
列:
- テーブル列の自動インクリメント
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
);
ウィンドウ関数row_number()
を使用します person_id
ごとにギャップのないシリアル番号を取得するには 。 VIEW
を永続化できます クエリでテーブルのドロップイン置換として使用して、これらの番号を準備することができます:
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;
参照:
- 複数のテーブルを持つ複数のトランザクションが関与するギャップのないシーケンス
または、ORDER BY
が必要な場合もあります 他の何か。たぶんcreated_at
?より良いcreated_at, address_history_id
可能な関係を断ち切るために。関連する回答:
- 代替シリアルの列
また、探しているデータ型はtimestamp
です。 またはtimestamptz
、 Postgresで:datetime
ではありません
- RailsとPostgreSQLでタイムゾーンを完全に無視する
そして、あなたはprevious_address
を保存する必要があるだけです (または詳細)、 、またはaddress
ではありません 。どちらも、正常なデータモデルでは冗長になります。original_address