首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PostgreSQL中获取下一个可用的auto_increment ID -一种更好的方法?

问在PostgreSQL中获取下一个可用的auto_increment ID -一种更好的方法?
EN

Stack Overflow用户
提问于 2012-06-13 13:48:10
回答 2查看 11.7K关注 0票数 6

我是postgreSQL的新手,所以非常感谢来自社区的任何建议。

我正在更新CMS中的一些功能,这是我刚刚继承的一个相当老的网站。基本上,在将文章插入数据库之前,我需要文章的ID。在数据库会话(insert)开始之前,有没有办法检查序列将使用的下一个值?

起初,我认为我可以使用SELECT max(id) from tbl_name,但是,由于id是从序列中自动递增的,并且文章经常被删除,因此它显然不会为序列中的下一个值返回正确的id。

由于文章还没有在数据库中,并且数据库会话还没有启动,所以我似乎不能使用postgreSQL的currval()功能。此外,如果我使用nextval(),它会在插入数据之前自动递增序列( insert还会自动递增序列,以双倍递增结束)。

我目前绕过它的方式如下:

代码语言:javascript
复制
function get_next_id()
{
    $SQL = "select nextval('table_id_seq')";
    $response = $this->db_query($SQL);
    $arr = pg_fetch_array($query_response, NULL, PGSQL_ASSOC);

    $id = (empty($arr['nextval'])) ? 'NULL' : intval($arr['nextval']);
    $new_id = $id-1;
    $SQL = "select setval('table_id_seq', {$new_id})";
    $this->db_query($SQL);

    return $id;
}

我使用SELECT nextval('table_id_seq')来获取序列中的下一个ID。当序列递增时,我立即使用SELECT setval('table_id_seq',$id)将序列设置回它的原始值。这样,当用户提交数据并且代码最终命中INSERT语句时,它会自动递增,并且insert语句前后的ID是相同的。

虽然这对我来说很有效,但我对postgreSQL不太感兴趣,我想知道它是否会导致任何问题,或者他们的方法不是更好的方法吗?有没有办法在不自动递增的情况下检查序列的下一个值?

如果有帮助,我正在使用postgresql 7.2

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-13 16:02:24

免责声明:我不确定7.2,因为我从来没有用过它。

显然,您的ID列被定义为从序列中获取其缺省值(可能是因为它被定义为serial,尽管我不知道在7.x中是否提供了它)。

如果删除了缺省值,但保留了序列,则可以在插入新行之前使用nextval()检索下一个ID。

删除列的默认值将要求您在插入期间始终提供一个ID (通过从序列中检索它)。如果你无论如何都要这样做,那么我看不出有什么问题。如果您想同时满足这两种情况,请创建一个before insert触发器( 7.x中是否有这些触发器?)这将检查ID列是否有值,如果没有,则从序列中检索一个新值,否则不对其进行处理。

但真正的问题是:为什么在插入之前需要ID。您可以简单地将行发送到服务器,然后通过调用curval()获得生成的id

但是再说一次:你真的应该(我指的是真的)和客户谈一谈,以便升级到最新版本的Postgres

票数 2
EN

Stack Overflow用户

发布于 2013-11-09 02:04:19

朋友们-在插入记录之前,有理由获得ID。例如,我有一个应用程序将ID存储为插入到另一个字段中的文本的一部分。只有两种方法可以做到这一点。

1)不管是什么方法,在插入之前获取ID以包含在我的INSERT语句中

2)插入,获取ID (同样,无论如何(SELECT ...或从插入...返回id;)),更新包含ID的记录的文本字段

许多评论和答案都假设操作员做错了什么……这是..。不对。OP清楚地指出“基本上,在将文章插入数据库之前,我需要它的ID”。操作员为什么要/需要这样做应该无关紧要-只需回答问题即可。

我的解决方案选择预先获取ID;因此,我根据需要执行nextval()和setval()以获得所需的结果。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11008889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档