插入和查看唯一ID

时间:2017-10-08 17:03:45

标签: javascript jquery

我有一个多个用户可以访问的表单。每次打开表单时,都会创建一个顺序的唯一ID,并在用户打开它时将其放在表单上。 id是唯一的非常重要。

为实现此目的,当用户打开表单时,会向服务器发送一个post请求,并将max id +1插入数据库。成功后,我发送一个get请求以从数据库中获取最大值。这个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,并且会是一个问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

创建SQL表时,可以将ID设置为“自动增量”。 这意味着每次进行“INSERT”语句时,都不必指定ID,它将自动生成。

在前面,你需要只发送相关的数据,没有id。 后端将调用DB。它的DB负责自动创建ID。

答案 1 :(得分: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语句中使用RETURNING

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;
    }
}