首页 > 解决方案 > 为 postgres 初始设置脚本设置变量

问题描述

我创建了以下安装脚本。该脚本应在部署应用程序(将在节点上运行)之前运行。这个想法是,它最终将包含所有表定义、关系、存储过程和一些种子数据,以使应用程序工作,并拆分为不同的文件。但目前我被困住了,因为我不知道如何将数据存储在变量中。在此示例中,我们有配置文件(因为用户是关键字)和库存。我希望每个用户都有一个库存。为此,我需要生成一个清单,将其 id 存储在一个变量中并将其传递给配置文件。
但由于某种原因,postgres 不允许我声明变量。这是我到目前为止得到的:

drop database test;
create database test;
\c test

create extension if not exists "uuid-ossp";    

create table inventory(
    id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
    name text
);

create table profile(
    id uuid PRIMARY KEY DEFAULT uuid_generate_v4(),
    name text,
    inventory_id uuid references inventory(id)
);

DECLARE myid uuid;

/*I want to set the inv_id to the result of this expression*/
insert into inventory(name) values('asdf') returning id into myid;


insert into profile(name,inventory_id) values ('user1',@myid)

但我收到以下错误:

$ psql -U postgres -f init.sql    
psql:init.sql:18: ERROR:  syntax error at or near "uuid"
LINE 1: DECLARE myid uuid;
                     ^

那么如何创建一个变量来存储这个 id 呢?一般来说,我做错了什么吗,因为我很确定 Declare 是 SQL 规范的一部分。

标签: postgresql

解决方案


您可以使用

WITH myids AS (
  INSERT INTO inventory(name)
  VALUES ('asdf')
  RETURNING id
)
INSERT INTO profile(name,inventory_id)
SELECT 'user1', id
FROM myids;

推荐阅读