sud*_*udo 2 postgresql sequence
假设我有一个带id BIGSERIAL
列的表。我刚刚开始了一个新的会话。我想知道id
我插入的下一行是什么。我怎么能说这个?
我不能简单地SELECT MAX(id) FROM my_table
(如果没有找到就返回 1),因为如果我之前删除了东西,下一个id
不会是 1,而是会更高。
我已经看过其他使用currval()
和的答案nextval()
。除非我在当前会话中插入,否则它们不起作用......而且我不想插入一行并查看我得到的 ID,哈哈。
我将要锁定表并在客户端上从 Python 脚本插入大量行,该脚本也在字典中跟踪行 ID。行 ID 必须匹配,所以我需要知道第一个是什么。我很惊讶没有其他人正在处理这种情况。
编辑:除非我在当前会话中插入,否则我对这些功能不起作用的看法是错误的,但请参阅下面的评论。
我想知道我插入的下一行的 id 是什么。我怎么能说出来,而不插入一行?
这正是nextval()
它的作用。但是,如果您没有插入到表中,我想不出对这个值有什么用处。它将是可能永远不会插入的行的 id 值:
重要提示:为了避免阻塞从同一序列中获取数字的并发事务,nextval 操作永远不会回滚;也就是说,一旦获取了一个值,它就被认为是已使用的,即使执行 nextval 的事务后来中止。这意味着中止的事务可能会在分配的值序列中留下未使用的“漏洞”。
如上所述,返回的值nextval()
几乎没有用,除非您插入到表中。但是,如果您要插入一些行并且只想要序列号的 id 值,则可以简单地使用以下RETURNING
子句INSERT
:
insert into t (col1, col2, ...)
values ( (value_a_col1, value_a_col2, ...),
(value_b_col1, value_b_col2, ...),
...
)
returning t_id ;
Run Code Online (Sandbox Code Playgroud)
请参阅SQLfiddle 中的示例。
一些更复杂的情况——比如当需要将 id 插入到更多表中时,通过外键相关,或者UPSERT
需要时——可以在一个语句中编写,使用RETURNING
和数据修改 CTE。
请注意,UPSERT
已在 9.5 中实现,带有INSERT ... ON CONFLICT DO NOTHING/UPDATE
构造。
下面的例子:
VALUES
,并SELECT
为INSERT
?UPSERT
在 PostgreSQL 中实现的惯用方式INSERT…RETURNING
具有多列的PostgreSQL multi如果您希望在不同的列中使用 id 值,请参阅:
归档时间: |
|
查看次数: |
2042 次 |
最近记录: |