我是 postgreSQL 的新手,所以非常感谢社区的任何指示。
我正在更新我刚刚继承的一个相当老的网站的 CMS 中的一些功能。基本上,在将文章插入数据库之前,我需要文章的 ID。无论如何在数据库会话(插入)开始之前检查序列将使用的下一个值吗?
起初我以为我可以使用SELECT max(id) from tbl_name
,但是由于 id 是从序列中自动递增的,并且文章经常被删除,它显然不会为序列中的下一个值返回正确的 id。
由于文章还没有在数据库中,并且数据库会话还没有开始,所以我似乎无法使用currval()
postgreSQL 的功能。此外,如果我使用nextval()
它在插入数据之前自动递增序列(插入也会自动递增序列,最终序列会加倍递增)。
我目前解决它的方式如下:
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 语句时,它会自动递增,并且插入之前和插入之后的 ID 是相同的。
虽然这对我有用,但我对 postgreSQL 并不太感兴趣,我想知道它是否会导致任何问题,或者它们是否不是更好的方法?有没有办法在不自动递增的情况下检查序列的下一个值?
如果有帮助,我正在使用 postgresql 7.2