【问题标题】:Is it possible to get the id to be inserted in the database before insert是否可以在插入之前获取要插入数据库的id
【发布时间】:2011-10-11 15:59:33
【问题描述】:

我在 PHP 中使用 PDO 和 PostgreSQL。

我会让我的用户上传文件。

我想将记录 id 添加到保存的图像中。

是否可以在插入数据库之前获取(或保留)记录ID。

我认为这是不可能的,只是想确定一下。

【问题讨论】:

  • 我不知道 PostgreSQL 但也许你可以得到最后插入的 id。假设您的 id 是具有身份属性的主键,则向其添加 1 可能会给您插入的 id。
  • 如果最后一条记录被删除了怎么办?那肯定会得到错误的ID。
  • @nevayeshirazi 这是个坏主意。如果另一个会话添加一行,或者使用该机制获得相同的 id,会发生什么?
  • 虽然效率一点也不高,但也许可以在用户完成插入操作之前使用表级锁来阻止其他用户从表中插入或删除实体。

标签: php postgresql pdo


【解决方案1】:

是的,您应该使用 postgres 函数 nextval 来获取序列中的下一个值。查看表的 id 列中的默认值,它应该包含对已使用序列的 nextval 调用。

例如,如果表格如下所示:

image_id bigint not null default nextval('image_image_id_seq'::regclass)
data bytea not null

您可以致电:

SELECT NEXTVAL('image_image_id_seq') ;

这将为您“保留” id 以供以后使用:

INSERT INTO image (image_id, data) VALUES (?, ?) ;

【讨论】:

  • 每个连接都是nextval。还是我得到了 nextval 并且 somelse 在数据库中插入了一条具有该 ID 的记录?
  • 这是一个全局序列,当你从序列中选择一个值时,它会加一并且该值不会被再次使用。
  • 我认为这在 MySQL 中是不可能的。
  • @PeerHaa:不,这在 MySQL 中是不可能的,因为它不支持序列。
  • @PeeHaa: nextval 是全局的,但 currvallastval 是每个会话的。
【解决方案2】:

你也可以这样做:

BEGIN
INSERT RETURNING
get id
rename file
COMMIT

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多