2017-10-08 62 views
0

我有一個可供多個用戶訪問的窗體。每次打開表格時,都會創建一個順序唯一的ID,並在用戶打開時將其放置在表單上。 id的獨特性非常重要。插入和查看唯一ID的有效方法

爲了達到這個目的,當用戶打開表單時,會向服務器發送一個post請求,並將max id +1插入到數據庫中。成功時,我發送一個獲取請求以從數據庫獲取最大值。此ID需要在表單上顯示。

這種方法工作正常... 有時。我通常會在每次打開表單時看到表單上的id增加。但有些時候,我連續看到相同的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,所以我的方法可能存在其他問題,例如,如果多個用戶同時訪問表單,他們可能會得到相同的ID,而且將是一個問題。

在此先感謝。

+1

這種做法是根本錯誤的。它關於什麼數據庫? –

+0

我正在使用postgres。但是我可以在數據庫中看到正確的值。這是獲取請求有時會得到錯誤的值。 –

+0

'Java'和'JavaScript'不是一回事,請使用正確的標籤。 – Oleg

回答

0

首先,您需要創建一個帶有串行主鍵字段的表。這將確保每個記錄的唯一ID。

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) 

添加數據顯示產生的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。

+0

感謝您的回覆...但是如果多個用戶可以同時訪問表單,我是否需要插入最大ID +1,以確保不會一遍又一遍生成相同的ID?每個用戶都需要一個唯一的表單ID。 –

+0

同時不是一個問題。數據庫被設計來處理這個問題。 你可以在這裏看到如何使用它:https://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm – user3761001

+0

postgresql爲自動遞增鍵提供串行(bigserial)類型。 –

相關問題