我正在尝试将所有应该全部或全部的事务包装到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;
原文地址:https://www.jb51.cc/postgresql/191896.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。