在PostgreSQL中获取下一个可用的auto_increment ID – 更好的方
我是postgreSQL的新手,所以非常感谢来自社区的任何指针.
我正在更新我刚刚继承的一个非常古老的网站的CMS中的一些功能.基本上,在将文章插入数据库之前,我需要它的ID.无论如何还是要检查数据库会话(插入)开始之前序列将使用的下一个值? 起初我以为我可以使用来自tbl_name的SELECT max(id),但是当id从序列自动递增并且文章经常被删除时,它显然不会为序列中的下一个值返回正确的id. 由于文章尚未在数据库中,并且数据库会话尚未启动,似乎我无法使用postgreSQL的currval()功能.此外,如果我使用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.当这增加序列I然后立即使用SELECT setval(‘table_id_seq’,$id)将序列设置回原始值.这样,当用户提交数据并且代码最终命中INSERT语句时,它会自动递增,插入前和插入后的ID相同. 虽然这对我有用,但我对postgreSQL并不太热,并想知道它是否会引起任何问题,或者它们是不是更好的方法?没有自动递增序列,是否无法检查序列的下一个值? 如果它有助于我使用postgresql 7.2 解决方法
免责声明:不确定7.2,因为我从未使用过.
显然,您的ID列被定义为从序列中获取其默认值(可能因为它被定义为序列,但我不知道它是否在7.x中可用). 如果删除默认值但保留序列,则可以在插入新行之前使用nextval()检索下一个ID. 删除列的默认值将要求您在插入期间始终提供ID(通过从序列中检索它).如果你这样做,那我没有看到问题.如果您想满足这两种情况,请创建一个前插入触发器(7.x有它们吗?),检查ID列是否有值,如果没有从序列中检索新值,否则不管它. 真正的问题是:为什么在插入之前需要ID.您可以简单地将行发送到服务器,然后通过调用curval()获取生成的id 但是,你应该真的(我的意思是真的)与客户谈谈升级到最新版本的Postgres (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |