postgresql - 为 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 规范的一部分。
解决方案
您可以使用
WITH myids AS (
INSERT INTO inventory(name)
VALUES ('asdf')
RETURNING id
)
INSERT INTO profile(name,inventory_id)
SELECT 'user1', id
FROM myids;
推荐阅读
- ruby - 纯红宝石英国电话号码验证器
- mongodb - 在 mongo DB 中通过 id 减去两个日期并以秒为单位返回值作为 json 元素
- cakephp - CakePHP fopen 无法打开流权限被拒绝
- asp.net-core - 从 .NET Core 2.1 迁移到 v3.1 后出现“被 CORS 阻止”错误
- python - 如何组合两个 python 字典并创建一个 csv 文件?
- java - Android Studio/Java - 如何使用 registerForActivityResult 从其他类获取数据
- python - 在 DFS 中寻找前后弧?
- java - java 11 openCSV 仅写入文件特定的 bean 属性
- javascript - 承诺 {
} 在 Web3 中 - python - 并行遍历字典中所有键的值中的列表?