【问题标题】:Get last inserted row ID with Psycopg2 and a Greenplum database使用 Psycopg2 和 Greenplum 数据库获取最后插入的行 ID
【发布时间】:2012-07-26 15:55:13
【问题描述】:

如何在 Greenplum 数据库中使用 psycopg2 获取最后插入行的 ID?

以下是我已经尝试过但不起作用的几件事。

  • Greenplum 不支持返回。
  • psycopg2 的 cursor.lastrowid 始终返回 0。
  • SELECT nextval() 为我提供下一行 id,但也会增加计数器,因此实际插入的行使用不同的 id。
  • 不支持 SELECT currval()。

提前致谢。

【问题讨论】:

    标签: sql postgresql psycopg2 greenplum


    【解决方案1】:

    SELECT lastval() 会做你想做的事吗?

    根据 Sequence Manipulation Functions 的 postgres(我收集 GreenPlum 是基于)文档,它应该“返回当前会话中 nextval 最近返回的值。”

    【讨论】:

    • GP 不支持 lastval() currval() 函数
    【解决方案2】:

    我认为你能得到的最接近的是select * from seq_name:

    dwh=# select * from queue_id_seq;
     sequence_name | last_value | increment_by |      max_value      | min_value | cache_value | log_cnt | is_cycled | is_called 
    ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+-----------
     queue_id_seq  |        127 |            1 | 9223372036854775807 |         1 |           1 |      32 | f         | t
    

    但是last_value 显示了任何会话分配的最后一个值

    或者,您可以根据“自然主键”回读插入的行

    我不会使用 nextval(),因为序列不是无间隙的。

    【讨论】:

      【解决方案3】:

      如果你想插入最后一个 id,你可以做一个基本的 sql 搜索来搜索最大 id 号

      【讨论】:

      • 这是一个无效的解决方案。它不适用于并发应用程序。
      • OP 没有设置该约束
      【解决方案4】:
      def last_insert_id(cursor, table_name, pk_name):
          sequence = "{table_name}_{pk_name}_seq".format(table_name=table_name,
                                                             pk_name=pk_name)
          cursor.execute("SELECT last_value from {sequence}".format(sequence=sequence))
          return cursor.fetchone()[0]
      

      你应该尝试这样的方法来解决你的问题,让它有点通用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 2020-09-12
        相关资源
        最近更新 更多