Sql 如何插入下一个最高数字

Sql 如何插入下一个最高数字,sql,postgresql,postgresql-9.3,Sql,Postgresql,Postgresql 9.3,我有一个具有id、tableid和seqnum的表。以下是表格结构: create table ztables ( id serial primary key, tableid integer, seqnum integer ) 和样本数据 +----+---------+-------+ | id | tableid | seqnum| +----+---------+-------+ | 1 | 5 | 1 | +----+---------+---

我有一个具有id、tableid和seqnum的表。以下是表格结构:

create table ztables
(
   id serial primary key,
   tableid integer,
   seqnum integer
)
和样本数据

+----+---------+-------+
| id | tableid | seqnum|
+----+---------+-------+
| 1  | 5       | 1     |
+----+---------+-------+
| 2  | 5       | 2     |
+----+---------+-------+
| 3  | 5       | 3     |
+----+---------+-------+
| 4  | 5       | 9     |
+----+---------+-------+
| 5  | 6       | 1     |
+----+---------+-------+
| 6  | 7       | 1     |
+----+---------+-------+
| 7  | 7       | 2     |
+----+---------+-------+
| 8  | 7       | 3     |
+----+---------+-------+

让我们以TableID5为例。您可以看到序列号的增加类似于数据库序列。但对于整个桌子,它不应该增加。我只想增加每个tableid。因此,如果插入另一个tableid为5的记录,seqnum将为10。如果插入了tableid为7的记录,则seqnum将为4。这样做的正确方式是什么。我还需要考虑并发问题。

这可能对您有所帮助,或者至少给您一个解决方案的想法:

insert into ztables (
  id,
  tableid,
  seqnum
)
select ? as id,
       tableid,
       max(seqnum) + 1 as seqnum
  from ztables 
 where tableid = ?
 group 
    by tableid
 union
select ? as id,
       ? as tableid,
       1 as seqnum
  from ztables
 order
    by 3 desc
 limit 1; 

必须用常量值替换问号

这已经被问了很多次了。。。我建议在标记历史中搜索类别序列或子序列等内容。这可能会有所帮助:在并发情况下,这将失败,除非您在独占模式下锁定表ztables或采取一些适当的行锁定。