2017-02-08 4 views
0

私のデータベースはPostgreSQLです。言語はJavaです。
テーブル名は、namephraseです。PostgreSQL固有の文字列フィールド

いつでも多くのユーザーがこのテーブルに多くの行を挿入しています。
そして、特定のフィールドが一意であることを確認する必要があります。
このようなフィールドが読み込み中に見つかった場合は、行IDを返す必要があります。

たとえば、フィールドに一意の主キーを作成し、行IDが挿入されたときに例外をキャッチして既存の行をルックアップすることができます。
しかし、それは悪い考えだと思います。

私は最初にその行を探してから挿入することができます。
しかし、どのようにして、並行トランザクションが互いにやりとりするのを避けることができますか?

ダウンロードする際に、バッチダウンロードを行う方がよいでしょうか。それをPostgreSQLでどうやって行うのですか?私も知らない。

+0

はトランザクションレベルを使用できますか? – stim644

答えて

1

例外をキャッチする代わりに、PostgreSQLで利用可能なINSERT ... ON CONFLICT DO NOTHING節を使用できます。影響を受けた行の数(戻りコードPreparedStatement.executeUpdate)を調べると、競合があったかどうかを検出できます。

など。

PreparedStatement pstmt = conn.prepareStatement("insert into x values (?,?) on conflict do nothing"); 
pstmt.setInt(1, myId); 
pstmt.setInt(2, myValue); 
int rc = pstmt.executeUpdate(); 
if (rc == 0) { 
    // fetch the existing row... 
} 
+0

代わりに文字列値を使用して文字列ハッシュコードを検索に使用できますか?それは検索をスピードアップしますか? – stim644

+0

文字列を使用してください。とにかくユニークなインデックスが必要なので、それは十分に速くなります –

1

あなたはUNIQUE制約とINSERT ... ON CONFLICT作成することができます。今すぐ

CREATE TABLE mytable (
    id integer PRIMARY KEY, 
    name text NOT NULL 
     CONSTRAINT name_unique UNIQUE 
); 

INSERT INTO mytable (id, name) 
    VALUES (1, 'me'); 

各affecte行のidを返すバッチINSERTを実行するために、実行を

INSERT INTO mytable (id, name) 
    VALUES (2, 'me'), 
      (3, 'new') 
ON CONFLICT (name) 
    DO UPDATE SET name = EXCLUDED.name 
RETURNING id; 

奇妙0​​ことidを元に戻したい場合は、実際に行を変更する必要はありません。

+0

検索のために文字列値を使用する代わりに文字列ハッシュコードを使用できますか?それは検索をスピードアップしますか? – stim644

+0

文字列ハッシュ値とは何ですか? –

関連する問題