2017-10-08 15 views
0

複数のユーザーがアクセスできるフォームがあります。フォームが開かれるたびに、ユーザーがそれを開いたときに、順次、一意のIDが作成され、フォームに配置されます。ユニークなIDは非常に重要です。一意のIDを挿入して表示する効率的な方法

これを実現するには、ユーザーがフォームを開くと、投稿要求がサーバーに送信され、最大ID +1がデータベースに挿入されます。成功すると、データベースから最大値を取得するリクエストを送信します。このIDはフォームに表示する必要があります。

このメソッドは正常に動作します... 時には。私は通常、フォームを開くたびにIDをインクリメントしています。私は、フォームが開かれた2回連続同じidを見たときしかし、時代があります

//This ajax requests posts the max value +1 to the DB and on success, gets the max value 
//which should be the next id in the sequence 

$.ajax({ 
     url: "/sendsDataToServer", 
     success: function(data) { 
     sendGetRequestToGetMaxValue(); 
     } 
    }); 

//insert max id + 1 to database 
INSERT INTO TABLE (id) VALUES (COALESCE(MAX(id), 0) +1); 

//Get max id from database 
SELECT MAX(id) FROM TABLE; 

は私がやろうとしているものを達成するためのより良い方法はありますか?もしそうなら、どのようにしてこのプロセスをより良くすることができますか?同じIDが2回連続して生成されているのを見ているので、私のアプローチには他の問題があるかもしれないことを恐れています。たとえば、複数のユーザーが同時にフォームにアクセスすると、問題になるだろう。

ありがとうございます。

+1

このアプローチを使用しRETURNING を使用するには、根本的に間違っています。どのデータベースですか? –

+0

私はポストグルを使用しています。しかし、私はデータベースの正しい値を見ることができます。時々間違った価値を得るのはリクエストを得ることです。 –

+0

'Java'と' JavaScript'は同じものではありません。正しいタグを使用してください。 – Oleg

答えて

0

まず、シリアルプライマリキーフィールドを持つテーブルを作成する必要があります。これにより、各レコードの一意のIDが確保されます。データを追加し、生成されたIDは、2つの方法で行うことができます表示

test=# create table tbl (id serial primary key, name varchar(255)); 
CREATE TABLE 
test=# \d tbl 
           Table "public.tbl" 
Column |   Type   |     Modifiers      
--------+------------------------+-------------------------------------------------- 
id  | integer    | not null default nextval('tbl_id_seq'::regclass) 
name | character varying(255) | 
Indexes: 
    "tbl_pkey" PRIMARY KEY, btree (id) 

:INSERT文で

test=# insert into tbl (name) values ('name 1') returning id; 
id 
---- 
1 
(1 row) 

INSERT 0 1 
test=# insert into tbl (name) values ('name 2') returning id; 
id 
---- 
2 
(1 row) 

INSERT 0 1 
test=# insert into tbl (name) values ('name 3') returning id; 
id 
---- 
3 
(1 row) 

INSERT 0 1 

またはJDBC

public long insertName(String name) throws SQLException { 
    String query = "insert into tbl (name) values (?)"; 

    try(PreparedStatement st = dataSource.getConnection().prepareStatement(query, Statement.RETURN_GENERATED_KEYS)) { 
     st.setString(1, name); 
     st.executeUpdate(); 

     try(ResultSet rs = st.getGeneratedKeys()) { 
      if(rs.next()) { 
       return rs.getLong(1); 
      } 
     } 

     return -1; 
    } 
} 
2

SQLテーブルを作成するときに、IDを「自動増分」として設定できます。 "INSERT"ステートメントを作成するたびにIDを指定する必要はなく、自動的に生成されます。

フロントでは、IDなしで関連性のあるデータのみを送信する必要があります。 バックエンドはDBを呼び出します。そのDBは自動的にIDを作成します。

+0

あなたの応答をありがとう...しかし、複数のユーザーが同時にフォームにアクセスできる場合、同じIDが何度も繰り返し生成されないように、最大​​ID +1を挿入する必要はありませんか?各ユーザーには一意のフォームIDが必要です。 –

+0

は同時に問題ではありません。 DBはこれを処理するように設計されています。 ここでそれを使用する方法を見ることができます:https://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm – user3761001

+0

postgresqlは、自動増分キーのシリアル(bigserial)タイプを提供します。 –

関連する問題