#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) другими вставками.