加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL事务块中获取ID

发布时间:2020-12-13 16:13:55 所属栏目:百科 来源:网络整理
导读:我正在尝试将所有应该全部或全部的事务包装到BEGIN和COMMIT中,但我不确定如何在以下情况下执行此操作. 我有3个表,一个用于图像,一个用于专辑,一个用于它们之间的关系,即album_images.系统的工作方式是用户可以创建一个专辑并在一次操作中用他的图像填充它. S
我正在尝试将所有应该全部或全部的事务包装到BEGIN和COMMIT中,但我不确定如何在以下情况下执行此操作.

我有3个表,一个用于图像,一个用于专辑,一个用于它们之间的关系,即album_images.系统的工作方式是用户可以创建一个专辑并在一次操作中用他的图像填充它. SQL如下:

BEGIN;
  INSERT INTO albums [...];  -- Create a new album row
  SELECT id AS album_id FROM albums WHERE [...];  -- Get that rows ID
  -- Now use album_id in the next statement
  INSERT INTO album_images (album_id,image_id) [...];
COMMIT;

这可能是一个常见问题,我只是不确定要搜索什么,我似乎也无法在文档中找到解决方案.

作为Cody提到的INSERT … RETURNING子句的替代,您可以使用与ID列关联的序列的当前值:
BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (currval('albums_id_seq'),image_id) [...];
COMMIT;

当为定义为serial的列自动创建序列时,这假设是Postgres的标准命名方案.

另一种选择 – 如果您只使用单个插入 – 是使用lastval()函数.您甚至不需要将序列名称放入INSERT语句中:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (lastval(),image_id) [...];
COMMIT;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读