如何从.sql脚本文件中获取postgres中自动增量列的值?

ams*_*ams 0 sql postgresql

在postgres我有两张桌子

CREATE TABLE foo ( 
    pkey   SERIAL PRIMARY KEY,
    name   TEXT
);

CREATE TABLE bar (
   pkey SERIAL PRIMARY KEY,
   foo_fk INTEGER REFERENCES foo(pkey) NOT NULL,
   other  TEXT
 ); 
Run Code Online (Sandbox Code Playgroud)

我想要做的是编写一个执行以下操作的.sql脚本文件

INSERT INTO foo(name) VALUES ('A') RETURNING pkey AS abc; 
INSERT INTO bar(foo_fk,other) VALUES 
               (abc, 'other1'),
               (abc, 'other2'),
               (abc, 'other3');
Run Code Online (Sandbox Code Playgroud)

这会在pgAdmin中产生以下错误

Query result with 1 row discarded.
ERROR:  column "abc" does not exist
LINE 3:                    (abc, 'other1'),

********** Error **********

ERROR: column "abc" does not exist
SQL state: 42703
Character: 122
Run Code Online (Sandbox Code Playgroud)

在存储过程之外如何定义一个我可以在语句之间使用的变量?是否有一些其他语法可以插入到bar中,并将插入返回到foo的pkey.

Igo*_*nko 5

您可以将查询合并为一个.就像是:

with foo_ins as (INSERT INTO foo(name) 
                 VALUES ('A') 
                 RETURNING pkey AS foo_id)
INSERT INTO bar(foo_fk,other)
SELECT foo_id, 'other1' FROM foo_ins
UNION ALL
SELECT foo_id, 'other2' FROM foo_ins
UNION ALL
SELECT foo_id, 'other3' FROM foo_ins;
Run Code Online (Sandbox Code Playgroud)

其他选项 - 使用匿名PL/pgSQL块,如:

DO $$
DECLARE foo_id INTEGER;
BEGIN
    INSERT INTO foo(name) 
    VALUES ('A') 
    RETURNING pkey INTO foo_id;

    INSERT INTO bar(foo_fk,other) 
    VALUES         (foo_id, 'other1'),
                   (foo_id, 'other2'),
                   (foo_id, 'other3');
END$$;
Run Code Online (Sandbox Code Playgroud)