【发布时间】:2020-10-31 17:04:00
【问题描述】:
我使用的是 PostgreSQL 12.3。
与已提出的许多问题类似,例如this one,,但我需要使用 RETURNING 子句中不存在的另一个表中的数据。
举一个人为的例子,考虑三个表:customers、products 和 sales,以及需要在销售点创建客户,并且需要更新销售表的场景users 和 products 的 ID。
CREATE TABLE public.customers (
id SERIAL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
)
CREATE TABLE public.products (
id SERIAL PRIMARY KEY,
product TEXT NOT NULL
)
CREATE TABLE public.sales (
id SERIAL PRIMARY KEY,
customer_id INTEGER NOT NULL REFERENCES customers(id),
product_id INTEGER NOT NULL REFERENCES products(id)
)
INSERT INTO customers (first_name, last_name) VALUES ('Bob', 'Smith');
INSERT INTO customers (first_name, last_name) VALUES ('Jane', 'Doe');
INSERT INTO products (product) VALUES ('widget 1');
INSERT INTO products (product) VALUES ('widget 2');
INSERT INTO products (product) VALUES ('widget 3');
INSERT INTO sales (customer_id, product_id) VALUES (1, 1);
INSERT INTO sales (customer_id, product_id) VALUES (2, 1);
INSERT INTO sales (customer_id, product_id) VALUES (2, 2);
如果我只需要客户 ID,则以下内容不会有问题:
WITH new_customer_and_new_sale AS (
INSERT INTO customers (first_name, last_name) VALUES ('John', 'Doe') RETURNING id
)
INSERT INTO sales (customer_id)
SELECT id FROM new_user_and_new_sale
由于sales 在returning 子句中没有找到约束,上述显然行不通。我已尝试加入表格以提取额外数据,但无法使其正常工作。
请忽略您在表结构方面可能遇到的任何小问题,因为我正在处理的数据有数百列和许多外键。我试图将问题浓缩为最简单的形式,但冒着看起来做作的风险。
【问题讨论】:
标签: sql postgresql sql-insert auto-increment