我有一个多个用户可以访问的表单。每次打开表单时,都会创建一个顺序的唯一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,并且会是一个问题。
提前致谢。
答案 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;
}
}