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

シーケンスを乱数に置き換える

    シリアルから一意でランダムに見える識別子を生成するには、暗号を使用することをお勧めします。それらの出力は全単射であるため(入力値と出力値の間に1対1のマッピングがあります)、衝突は発生しません 、ハッシュとは異なります。つまり、識別子はハッシュほど長くする必要はありません。

    ほとんどの暗号化暗号は64ビット以上のブロックで機能しますが、PostgreSQLwikiにはサンプルPL/pgSQLプロシージャがあります「非暗号化」暗号の場合 (32ビット)intで動作する関数 タイプ。免責事項:私はこの機能を自分で使用したことはありません。

    主キーに使用するには、WikiページからCREATE FUNCTION呼び出しを実行してから、で実行します。 テーブルは次のことを行います:

    ALTER TABLE foo ALTER COLUMN foo_id SET DEFAULT pseudo_encrypt(nextval('foo_foo_id_seq')::int);
    

    そして出来上がり!

    pg=> insert into foo (foo_id) values(default);
    pg=> insert into foo (foo_id) values(default);
    pg=> insert into foo (foo_id) values(default);
    pg=> select * from foo;
      foo_id   
    ------------
     1241588087
     1500453386
     1755259484
    (4 rows)
    


    1. org.postgresql.util.PSQLException:エラー:列user0_.idが存在しません-Hibernate

    2. Django +Postgres+大規模な時系列

    3. 'System.Data.Entity.Migrations.DbMigrationsConfiguration`1'のタイプ初期化子が例外をスローしました

    4. Oracleの単一のselectステートメントに複数のパーティションを含める方法