Say есть три таблицы для вашего хлебопекарного бизнеса:MySQL две вставки заявления в одной транзакции с зависимостью
online_order
invoice
customer_id
Ваш босс звонит вам и говорит: «Мне нужно, чтобы заказать шоколадный торт для всех наших клиентов, выставлять счета им все отдельно ». Итак, теперь вы должны сделать две вещи:
- Создать
online_order
запись для каждого клиента - Затем счет на их для этого заказа.
Однако каждый клиент должен иметь свой СОБСТВЕННЫЙ номер онлайн-заказа, который они могут ссылаться на свой счет.
Как вы можете это сделать за одну транзакцию? Ниже я имею (psuedocode), но я покажу вам свой результат и ожидаемый результат.
BEGIN;
-- First lets create the order
INSERT INTO online_order (online_order_id, date, cake_type, cake_flavor)
VALUES
(AUTO_INCREMENT, NOW(), round, chocolate);
-- Then take that online_order_id and create an invoice out of it for one of our customers
INSERT INTO invoice (date, online_order_id, invoice_amt, customer_id)
SELECT
NOW(),
LAST_INSERT_ID(),
10.00,
CUSTOMER_ID
FROM CUSTOMER;
ROLLBACK;
END;
Мой выход
-- Let's say the next auto-incremented online_order_id is 10011:
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "1");
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "2");
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "3");
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "4");
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "5");
Желаемая выход (различные online_order_id
для каждого счета-фактуры)
INSERT INTO invoice VALUES ("2016-01-01", 10011, 10.00, "1");
INSERT INTO invoice VALUES ("2016-01-01", 10012, 10.00, "2");
INSERT INTO invoice VALUES ("2016-01-01", 10013, 10.00, "3");
INSERT INTO invoice VALUES ("2016-01-01", 10014, 10.00, "4");
INSERT INTO invoice VALUES ("2016-01-01", 10015, 10.00, "5");
мне нужно вставить заказ, а затем вставьте счет, а затем вставить заказ, то вставьте счет-фактуру .... для каждого клиента. Как я могу написать это в MySQL? Спасибо!
Вам нужна хранимая процедура, чтобы вы могли написать цикл. Или делайте это на языке приложений, таком как PHP или Python. – Barmar
Откройте таблицу своих клиентов в курсоре в хранимой процедуре, прокрутите курсор и для каждого клиента сделайте 2 вставки и зафиксируйте в конце. – Shadow
Ваш псевдокод вставляет только одну строку? И у вас нет клиента в ваших заказах? Это действительно то, что вы хотите? Если вы добавите клиента в таблицу заказов (и добавьте строку для каждого из них, используя «... от клиента»), вы можете просто использовать 'INSERT INTO invoice (...) выбрать« 2016-01-01 », online_order_id, 10.00, customer_id из online_order, где online_order_id> = last_insert_id() '. Любая реальная система erp будет использовать процедуру для создания счетов-фактур, но поскольку ваш вопрос кажется далеким от любых реальных проблем, вы можете сделать это именно так. – Solarflare