使用redshift在行插入后获取主键

时间:2016-02-08 23:46:49

标签: postgresql psycopg2 amazon-redshift

我使用postgresql 8.0.2和amazon redshift,我试图设置INSERT命令,同时返回PRIMARY KEY

我原本试图做以下事情:

with get_connection() as conn:
    with conn.cursor() as cur:
    cur.execute('INSERT INTO orders (my_id, my_amount) \
                 VALUES (%s, %s) RETURNING row_id;', (some_id, some_amount))
    conn.commit()

但是,RETURNING命令仅适用于postgresql 8.2及更高版本。

我看到currval可能是让它工作的可能方法,但我读到它需要一个序列对象。

我试图插入以下架构

CREATE SEQUENCE order_seq;

CREATE TABLE IF NOT EXISTS orders
(
    order_id INTEGER IDENTITY(1,1) PRIMARY KEY DISTKEY, 
)

然后做:

with get_connection() as conn:
    with conn.cursor() as cur:
        cur.execute('INSERT INTO orders (my_id, my_amount) \
                     VALUES (%s, %s);', (some_id, some_amount))
        conn.commit()
        cur.execute('SELECT currval();')
        row_id = cursor.fetchone()[0]

更新:redshift也不支持序列对象。我觉得这是一个非常基本的过程,但没有简单的方法来获取对当前行的引用。

1 个答案:

答案 0 :(得分:1)

只需将列定义为:

order_id INTEGER PRIMARY KEY DISTKEY

创建序列时order_seq使用此命令作为插入命令:

cur.execute('INSERT INTO orders (order_id, my_id, my_amount) \
                 VALUES (nextval(''order_seq''), %s, %s);', (some_id, some_amount))

由于您使用的是序列,因此必须在insert命令中添加字段才能正确使用nextval

要检索当前序列值,请执行以下操作:

cur.execute('SELECT currval(''order_seq'')')
row_id = cursor.fetchone()[0]

我对你使用的语言并不熟悉,所以你可能不得不改变语法来改变我使用的双引号。

nextvalcurrval的语法如:nextval('sequenceName')currval('sequenceName')

因此,如果它不支持sequences,我认为它可以解决您的问题的唯一方法是执行以下步骤:

  1. 打开一个交易(所以其他人不会得到相同的ID)
  2. 将您的表格的最大ID(如select max(order_id) from orders)提取到变量
  3. 在插入上使用此值,因为它是序列。