sql >> データベース >  >> RDS >> PostgreSQL

複合キーの行のグループごとのシリアル番号

    しないでください。それは何度も試されており、それは苦痛です。

    プレーンな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 datetimeではありません Postgresで:

    • RailsとPostgreSQLでタイムゾーンを完全に無視する

    そして、あなたはprevious_addressを保存する必要があるだけです (または詳細)、addressではありません 、または original_address 。どちらも、正常なデータモデルでは冗長になります。




    1. ウェビナー:Postgres12の新機能[フォローアップ]

    2. MariaDB JSON_ARRAYAGG()の説明

    3. AMD、Intel、およびPostgreSQL

    4. PostgreSQLで2つのスキーマを比較する方法