2017-01-06 3 views
-1

MongoDBからPostgreSQLに切り替えると、MongoIdによって各rawを一意に識別するためにMongoDBで使用されているのと同じ概念をどのように実装できるのだろうかと思っていました。POSTGRESQL:varchar型フィールドのオートインクリメント

移行後、データベースに既に存在する固有のフィールドは、文字タイプとして保存されます。私は最小のソースコードの変更を探しています。

したがって、テーブルに挿入するたびに自動インクリメンタル一意のIDを生成するための方法がpostgresqlに存在する場合。

+0

* MongoId※[のObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/)にMongoDBを入力意味ですか? (一部のAPIではMongoIdという名前が使用されていますが、明示的に記述してください)。その場合、移行後に16進形式になっていますか? – pozs

+0

ええ、それは16進形式です。 – CelinVeronicca

+1

PostgreSQLのもっとも近いものは、['uuid'型](https://www.postgresql.org/docs/current/static/datatype-uuid.html)です。 MongoDBの 'ObjectId'はわずか12バイトしか持ちませんが、UUIDは128ビット(16バイト)です。しかし、既存のIDをf.exを追加する(または追加する)ことで変換できます。彼らには「00000000」があります。 ['uuid-ossp'モジュール](https://www.postgresql.org/docs/current/static/uuid-ossp.html)で様々なUUID(カラムのデフォルト値)を生成することができます – pozs

答えて

1

PostgreSQLのMongoDB's ObjectIdに最も近いのはuuid typeです。 ObjectIdは12バイトしか持ちませんが、UUIDは128ビット(16バイト)です。

既存のIDは、f.exを追加(またはプリペンド)することで変換できます。彼らに'00000000'

alter table some_table 
    alter id_column 
    type uuid 
    using (id_column || '00000000')::uuid; 

スキーマ+データを移行する際にこれを行うことができますが、これが最善の方法ですが、移行中にこの操作を実行できない場合は、IDを更新する必要があります(まだvarchar:この方法では参照先の列に変更が反映されます)。外部キーを削除し、alter typeを実行してから外部キーを再適用します。

uuid-ossp moduleでさまざまなUUID(列のデフォルト値)を生成できます。

create extension "uuid-ossp"; 

alter table some_table 
    alter id_column 
    set default uuid_generate_v4(); 
0

は、列のデフォルトとしてシーケンスを使用します。

create sequence some_id_sequence 
    start with 100000 
    owned by some_table.id_column; 

start withは、あなたの現在の最大数、その後大きくなるはずです。

その後、あなたの列のデフォルトとしてそのシーケンスを使用します。

alter table some_table 
    alter id_column set default nextval('some_id_sequence')::text; 

より良い解決策は、整数列に列を変更することです。 text(またはvarchar)の列に数値を格納することは、本当に悪い考えです。

+0

フィールドが外部キーであり、dbにデータがいっぱいであるためvarcharに変更できません – CelinVeronicca

+0

@CelinVeronicca:他の列も同様に変更する必要があります。 'varchar'に数値を格納することは、実際には**悪い**アイデアです。それははるかに多くのスペースを占有し、適切な数を使用すると遅くなります –

関連する問題