【问题标题】:PostgreSQL: INSERT into and get the new ID for usage in LO-BASEPostgreSQL:插入并获取新 ID 以在 LO-BASE 中使用
【发布时间】:2020-09-10 23:36:07
【问题描述】:

我想在表格中添加一行:

CREATE TABLE actors (
    id_act serial NOT NULL,
    first_name text NOT NULL,
    last_name text NOT NULL,
    CONSTRAINT actors_pkey PRIMARY KEY (id_act)
); 
INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks');

使用dBeaver,此语句提供新ID:

select CurrVal(pg_get_serial_sequence('actors', 'id_act'));

使用 LibreOffice-BASE,我必须添加方案的名称,这会导致 错误:列“scheme_name.table_name”不存在 我有同样的错误使用: “scheme_name.table_name” “方案名称”。“表名称” “表名”

如何获取新 ID 以供进一步使用(计算、检查……)?我不介意使用 CurrVal 或 RETURNING 或其他东西。但我没有找到正确的语法。

谢谢!

【问题讨论】:

    标签: sql postgresql select sql-insert libreoffice-base


    【解决方案1】:

    共有三种方式,将为您提供新的 id

    1. 使用 SERIAL 和 PRIMARY KEY,postgres 会自动插入一个唯一值

         CREATE TABLE actors (
           id_act SERIAL PRIMARY KEY
           first_name text NOT NULL,
           last_name text NOT NULL
         ); 
      
    2. 如果你有序列,你可以在创建 DDL 和每次插入数据时使用这个序列, 将生成新的 id

       CREATE TABLE actors (
         id_act integer NOT NULL DEFAULT nextval('sequence_name')
         first_name text NOT NULL,
         last_name text NOT NULL,
         CONSTRAINT actors_pkey PRIMARY KEY (id_act)
       ); 
      
    3. 如果你有序列,在插入查询中使用序列

        CREATE TABLE actors (
          id_act integer,
          first_name text NOT NULL,
          last_name text NOT NULL,
          CONSTRAINT actors_pkey PRIMARY KEY (id_act)
        ); 
      
      
      INSERT INTO actors (id_act, first_name, last_name) VALUES (nextval('sequence_name'), 'Tom', 'Hanks');
      

    【讨论】:

      【解决方案2】:

      您可以在 CTE 中使用 insert 然后返回值:

      WITH i AS (
            INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks') 
                RETURNING id_act
           )
      SELECT i.*
      FROM i;
      

      外部查询是SELECT,因此您的用户界面应该能够接受它返回一个值。

      您甚至可以在此语句中继续处理——例如,通过添加更多 CTE——因此您不需要实际获取值。

      【讨论】:

        【解决方案3】:

        最简单的选择是在INSERT 查询中使用RETURNING 子句:

        INSERT INTO actors (first_name, last_name) VALUES ('Tom', 'Hanks') 
        RETURNING id_act;
        

        【讨论】:

        • 试过了,但 BASE 返回错误:类型:com.sun.star.sdbc.SQLException 消息:SQL 代码提供了结果,但没有预期的结果。找到了一个类似的示例 [链接] (postgresqltutorial.com/postgresql-insert),最后一章“获取最后一个插入 id”:**我需要从那里获取“8”以用于其他地方的存储,
        • @StOMicha:我不了解 BASE,但您可能需要将执行查询的方法更改为允许返回值的方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-01
        • 2011-08-16
        • 2021-06-04
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 2021-04-10
        相关资源
        最近更新 更多