Sql 如何插入下一个最高数字
我有一个具有id、tableid和seqnum的表。以下是表格结构: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 | +----+---------+---
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或采取一些适当的行锁定。