在PostgreSQL事务块中获取ID

Ste*_*fen 7 sql postgresql transactions

我想总结我的所有交易,应该是要么全有要么全无成BEGINCOMMIT,但我不知道怎么样在下列情况下做到这一点.

我有3个表,一个用于图像,一个用于albums它们,一个用于它们之间的关系,即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;
Run Code Online (Sandbox Code Playgroud)

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

a_h*_*ame 7

作为Cody提到的INSERT ... RETURNING子句的替代,您可以使用与ID列关联的序列的当前值:

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (currval('albums_id_seq'), image_id) [...];
COMMIT;
Run Code Online (Sandbox Code Playgroud)

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

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

BEGIN;
  INSERT INTO albums [...];
  INSERT INTO album_images (lastval(), image_id) [...];
COMMIT;
Run Code Online (Sandbox Code Playgroud)