我是postgreSQL的新手,所以非常感谢来自社区的任何建议。
我正在更新CMS中的一些功能,这是我刚刚继承的一个相当老的网站。基本上,在将文章插入数据库之前,我需要文章的ID。在数据库会话(insert)开始之前,有没有办法检查序列将使用的下一个值?
起初,我认为我可以使用SELECT max(id) from tbl_name,但是,由于id是从序列中自动递增的,并且文章经常被删除,因此它显然不会为序列中的下一个值返回正确的id。
由于文章还没有在数据库中,并且数据库会话还没有启动,所以我似乎不能使用postgreSQL的currval()功能。此外,如果我使用nextval(),它会在插入数据之前自动递增序列( insert还会自动递增序列,以双倍递增结束)。
我目前绕过它的方式如下:
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
发布于 2012-06-13 16:02:24
免责声明:我不确定7.2,因为我从来没有用过它。
显然,您的ID列被定义为从序列中获取其缺省值(可能是因为它被定义为serial,尽管我不知道在7.x中是否提供了它)。
如果删除了缺省值,但保留了序列,则可以在插入新行之前使用nextval()检索下一个ID。
删除列的默认值将要求您在插入期间始终提供一个ID (通过从序列中检索它)。如果你无论如何都要这样做,那么我看不出有什么问题。如果您想同时满足这两种情况,请创建一个before insert触发器( 7.x中是否有这些触发器?)这将检查ID列是否有值,如果没有,则从序列中检索一个新值,否则不对其进行处理。
但真正的问题是:为什么在插入之前需要ID。您可以简单地将行发送到服务器,然后通过调用curval()获得生成的id
但是再说一次:你真的应该(我指的是真的)和客户谈一谈,以便升级到最新版本的Postgres
发布于 2013-11-09 02:04:19
朋友们-在插入记录之前,有理由获得ID。例如,我有一个应用程序将ID存储为插入到另一个字段中的文本的一部分。只有两种方法可以做到这一点。
1)不管是什么方法,在插入之前获取ID以包含在我的INSERT语句中
2)插入,获取ID (同样,无论如何(SELECT ...或从插入...返回id;)),更新包含ID的记录的文本字段
许多评论和答案都假设操作员做错了什么……这是..。不对。OP清楚地指出“基本上,在将文章插入数据库之前,我需要它的ID”。操作员为什么要/需要这样做应该无关紧要-只需回答问题即可。
我的解决方案选择预先获取ID;因此,我根据需要执行nextval()和setval()以获得所需的结果。
https://stackoverflow.com/questions/11008889
复制相似问题