Я использую PostgreSQL 12.3.
Подобно многим вопросам, которые задавали по этому поводу, например, этот, , но мне нужно использовать данные из другой таблицы, которая отсутствует в предложении RETURNING.
В качестве надуманного примера рассмотрим три таблицы: customers
, products
и sales
, а также сценарий, в котором клиент должен быть создан в точке продажи, а в таблицу продаж необходимо добавить идентификаторы users
и products
.
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);
Если мне нужен только идентификатор клиента, следующее не будет проблемой:
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
имеет ограничения, не найденные в предложении возврата, очевидно, что вышеуказанное не сработает. Я пробовал объединить таблицы, чтобы получить дополнительные данные, но не смог заставить их работать.
Пожалуйста, не обращайте внимания на любые незначительные проблемы, которые могут возникнуть со структурой таблиц, поскольку данные я Я работаю с сотнями столбцов и множеством внешних ключей. Я попытался сжать проблему до ее простейшей формы, рискуя показаться надуманной.