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

标签 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
 ); 

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

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

在 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

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

最佳答案

您可以将查询合并为一个。像这样的东西:

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;

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

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$$;

关于sql - 如何从 .sql 脚本文件中获取 postgres 中自动递增列的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337663/

相关文章:

c# - 显示调用 SaveChanges() 时由 Entity Framework Core for PostgreSQL 生成的数据库查询

postgresql - 从 pg_dump 恢复数据不会覆盖数据,但会将数据附加到原始数据库

sql - 选择小于 site_name 的 site_acr

sql - 数据库持续集成 (CI) 的 Tarantino 替代方案?

mysql - 在sql中如何编写在where子句中提供两个值的子查询

python - python 中的 sql INSERT(postgres、游标、执行)

sql - Postgresql——其他条件相同,查询(小)整数或浮点值是否比查询(小)字符串值更快?

sql - EXISTS 内部 CASE 内部 AGGREGATE FUNCTION

mysql - 左连接运行速度比内连接快得多

node.js - Sequelize 查询以查找落在日期范围和时间范围之间的所有记录