вставка mysql в несколько таблиц

#sql #database

#sql #База данных

Вопрос:

База данных состоит из четырех таблиц: customers, orders, order_item и products. в настоящее время таблица customers состоит из 2 клиентов, а таблица products — из 4 продуктов. допустим, cutomer_id: 1, имеет product_id: 1 и product_id: 2 в корзине.

Как я могу вставить информацию как в таблицу orders, так и в order_item, где order получает полное имя клиента, а customer_id и order_items получают ключ order_id

клиенты:

  ------------- ------------ ----------- ---------- 
| customer_id | first_name | last_name | city     |
 ------------- ------------ ----------- ---------- 
|       (PK)1 | Joe        | Katz      | Brooklyn |
|       (PK)2 | Mike       | Smith     | Brooklyn |
 ------------- ------------ ----------- ---------- 
  

Заказы:

 | order_id | customer_id | order_status | customer_name |
 ---------- ------------- -------------- --------------- 
|   (PK)   | (FK)        |             |                |
 ---------- ------------- -------------- --------------- 
  

order_item:

  --------- ---------- ------------ ---------- ------------ 
| item_id | order_id | product_id | quantity | list_price |
 --------- ---------- ------------ ---------- ------------ 
|  (PK)   | (FK)     |  (FK)      |          |            |
 --------- ---------- ------------ ---------- ------------ 
  

продукты:

  ------------ -------------- ------------ 
| product_id | product_name | list_price |
 ------------ -------------- ------------ 
|      (PK)1 | jeans        |         45 |
|      (PK)2 | shoes        |        100 |
|      (PK)3 | socks        |          7 |
|      (PK)4 | coat         |        160 |
 ------------ -------------- ------------ 
  

Комментарии:

1. В какой базе данных вы пытаетесь это сделать? MySQL или Oracle? Один оператор insert не будет выполнять обе функции. Обычно вы запускаете транзакцию, вставляете в родительскую таблицу и получаете обратно вновь созданный ключ. Затем вы вставляете в дочернюю таблицу с ключом. Наконец, вы завершаете транзакцию. Синтаксис транзакции и способ возврата ключа из родительской таблицы могут зависеть от базы данных, с которой вы работаете.

2. Я удалил конфликтующие теги, пожалуйста, добавьте обратно тот, который соответствует вашей СУБД.

3. @MikeWodarczyk Я использую MySQL, поэтому без серверной части невозможно сделать это только с MySQL, выполняя все команды одновременно

4. Если ваша родительская таблица имеет уникальный индекс, все значения которого вам известны, вы можете вставить в дочерние таблицы, используя подзапрос для поиска родительского ключа из тех же инструкций Sql. Будут отдельные вставки, но они будут связаны и известны заранее. Например, если в вашей родительской таблице был уникальный столбец «SalesOrderNumber», вы могли бы «вставить в salesorderheader (salesorderno) значения (‘123456’); вставить в salesorderdetail (SalesORderHeaderId, ItemCode, quantiy) значения ( (Выберите salesorderheaderid из salesorderheader, где salesorderno = ‘123456’), ‘firstItem’, 11);

5. Для вас это выглядит так, как будто единственным уникальным ключом в родительской таблице является order_id, который, похоже, сгенерирован базой данных. Вы могли бы посмотреть это следующим образом: начать транзакцию; вставить в orders (customer_id, …) значения (‘MikeW’, …); вставить в order_items (order_id, item_id, …) значения (выберите max (order_id) из orders, где customer_id = ‘MikeW’ группируется по customer_id), ‘новая клавиатура’, …); зафиксировать; Я предполагаю, что идентификаторы order_id являются последовательными. Транзакция должна предотвращать перекрестное загрязнение подзапросов max (order_id) другими вставками.