我有三个表,我使用这些查询创建:
create table parents(
rowid serial primary key,
display_name varchar,
unique(display_name)
);
create table clients(
rowid serial primary key,
parent int,
display_name varchar,
foreign key (parent) references parents(rowid),
unique(display_name, parent)
);
create table datapoints(
rowid serial primary key,
client int,
val float8,
foreign key (client) references clients(rowid)
);
我正在获取包含父名称、客户端名称和一些值的数据。每次获得这些数据时,我都想向数据点表中添加行。我还想向 clients 和 parents 表添加行,但前提是我收到的数据具有无法识别的名称。
例如,我可能会得到以下数据:
“parent1-client1-123.0”
我想要实现的是处理这些数据(在查询中),这种方式:
如果需要,在“父母”表中插入一行。
如果需要,使用适当的父 ID(在上一步中获得?)向“客户”表插入一行。
使用适当的客户端 ID(在上一步中获得?)在“数据点”表中插入一行。
我如何通过查询来管理它?我的程序员想写:
- 如果需要,插入父母。将适当父级的 ID 保存在变量“current_parent”中
- 如果需要,使用“current_parent”变量插入客户端。将相应客户端的 ID 保存在变量“current_client”中。
- 使用上一页中的“current_client”变量插入数据点。步。
但显然这不是 sql 的工作方式,对吧?如果我有 5 个或 10 个而不是这三个“嵌套”表呢?(!)
请帮忙
这是一个微不足道的应用
INSERT ... RETURNING
:然后您可以将返回的值用于 next
INSERT
。您可以使用 CTE 在单个 SQL 语句中执行所有三个插入操作: