postgresql:插入并获取新的id,以便在lobase中使用

uxhixvfz  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(349)

我想在表中添加一行:

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\u name.table\u name”不存在我使用“scheme\u name.table\u name”“scheme\u name”“table\u name”时遇到相同的错误
如何获得新的id以供进一步使用(计算、检查等)?我不介意用currval或returning或其他什么。但是我没有找到正确的语法。
谢谢您!

ogq8wdun

ogq8wdun1#

最简单的选择是使用 RETURNING 你方合同中的条款 INSERT 查询:

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

ztigrdn82#

你可以使用 insert 然后返回值:

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

外部查询是 SELECT ,因此您的ui应该对它返回值感到满意。
您甚至可以在该语句中继续处理—例如,通过添加更多CTE—这样就不需要实际获取值。

j0pj023g

j0pj023g3#

有三种方法可以为你提供新的身份证
使用串行和主键,postgres将自动插入一个唯一的值

CREATE TABLE actors (
     id_act SERIAL PRIMARY KEY
     first_name text NOT NULL,
     last_name text NOT NULL
   );

如果有序列,则可以在创建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)
 );

如果有sequence,请使用insert查询中的sequence

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');

相关问题