Добавление новых записей в 2 таблицы
Добрый день!
Есть 2 таблицы:
1 - ORDER:
id_order;
date;
status.
2 - ORDER_ITEMS:
id_order;
id_product;
amount.
Как правильно сделать запрос (или запросы), чтоб реализовать следующее:
1. Добавляем запись в таблицу ORDER (id_order уникальный ключ - номер заказа)
2. Добавляем записИ в таблицу ORDER_ITEMS, где id_order - номер заказа присвоенный при добавлении записи в первой таблмце.
Понятно, что я знаю, как добавить запись в одну таблицу. Но тут что-то никак не соображу.
Спасибо заранее за ответ!
С уважением
Наталья
Есть 2 таблицы:
1 - ORDER:
id_order;
date;
status.
2 - ORDER_ITEMS:
id_order;
id_product;
amount.
Как правильно сделать запрос (или запросы), чтоб реализовать следующее:
1. Добавляем запись в таблицу ORDER (id_order уникальный ключ - номер заказа)
2. Добавляем записИ в таблицу ORDER_ITEMS, где id_order - номер заказа присвоенный при добавлении записи в первой таблмце.
Понятно, что я знаю, как добавить запись в одну таблицу. Но тут что-то никак не соображу.
Спасибо заранее за ответ!
С уважением
Наталья
1 Я делаю генерацию по дате + рандом, далее в цикле проверяю существует ли номер заказа и перегенерирую его если нужно..
2 Ещё один запрос сделай.
2 Ещё один запрос сделай.
[syntax=Delphi] [/syntax]
Спасибо. Я немножко уточню свой вопрос.
Есть ли в MySQL возможность, при выполнении запроса INSERT INTO получить назад значение auto_increment ID (в моем случае это ID_ORDER)?
Есть ли в MySQL возможность, при выполнении запроса INSERT INTO получить назад значение auto_increment ID (в моем случае это ID_ORDER)?
При выполнении нет, после выполнения это можно сделать с помощью функции LAST_INSERT_ID().natariga писал(а): Есть ли в MySQL возможность, при выполнении запроса INSERT INTO получить назад значение auto_increment ID (в моем случае это ID_ORDER)?
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Примерный план такой:natariga писал(а):Добрый день!
Есть 2 таблицы:
1 - ORDER:
id_order;
date;
status.
2 - ORDER_ITEMS:
id_order;
id_product;
amount.
Как правильно сделать запрос (или запросы), чтоб реализовать следующее:
1. Добавляем запись в таблицу ORDER (id_order уникальный ключ - номер заказа)
2. Добавляем записИ в таблицу ORDER_ITEMS, где id_order - номер заказа присвоенный при добавлении записи в первой таблмце.
Понятно, что я знаю, как добавить запись в одну таблицу. Но тут что-то никак не соображу.
Спасибо заранее за ответ!
С уважением
Наталья
BEGIN TRANSACTION
insert into ORDER (date, status) values (now(), 1);
insert into ORDER_ITEMS (id_order,id_product,amount) values (LAST_INSERTED_ID(), 567, 2);
COMMIT
LAST_INSERT_ID() - нужно учитывать что функция возращает последний индексный элемент, если поле номера не является индексом - бесполезно..
Транзакции тут вообще не нужны..
Генерируешь номер делаешь 2 запроса.. всё.
Транзакции тут вообще не нужны..
Генерируешь номер делаешь 2 запроса.. всё.
[syntax=Delphi] [/syntax]
Хорошая поправка, только не совсем правильная.Duncon писал(а):LAST_INSERT_ID() - нужно учитывать что функция возращает последний индексный элемент, если поле номера не является индексом - бесполезно..

Если допустима ситуация, когда была вставлена запись в таблицу ORDER, и не вставлена соответствующая запись в таблицу ORDER_ITEMS, то можно не использовать транзакции.Duncon писал(а):Транзакции тут вообще не нужны..
Генерируешь номер делаешь 2 запроса.. всё.
понятно. спасибо!
я подумаю, как лучше.
Склоняюсь, к генерированию номера заказа, и запись его как поля в обе таблицы, а не auto_increment ID.
или все же values (LAST_INSERTED_ID(), 567, 2).....
а не посоветуете, в каком из способов больше плюсов, а в каком минусов.
я подумаю, как лучше.
Склоняюсь, к генерированию номера заказа, и запись его как поля в обе таблицы, а не auto_increment ID.
или все же values (LAST_INSERTED_ID(), 567, 2).....

а не посоветуете, в каком из способов больше плюсов, а в каком минусов.

Суть транзакций в выполнении большого количества запросов, при этом блокируется таблица, для 2 запросов это бессмысленно больше времени уйдёт на блокировку...
[syntax=Delphi] [/syntax]
Лучше использовать auto_increment, это избавит тебя от проблем генерации ключа и проверки на его уникальность. Эта задача не супер сложная, но надо сделать все очень аккуратно, особенно в случае когда записи добавляет не один клиент, а несколько одновременно. Собственно auto_increment избавляет тебя от всего этого и собственно именно для таких случаев оно и сделано. Зачем изобретать велосипед?natariga писал(а):понятно. спасибо!
я подумаю, как лучше.
Склоняюсь, к генерированию номера заказа, и запись его как поля в обе таблицы, а не auto_increment ID.
или все же values (LAST_INSERTED_ID(), 567, 2).....
а не посоветуете, в каком из способов больше плюсов, а в каком минусов.![]()

--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Ты совершенно не прав! Суть транзакции заключается в выполнении нескольких запросов как одного целого. То есть либо все insert/update данной транзакции будут выполнены, либо ни одно из них. То что ты описываешь называется блокировками. Они бывают разных типов (блокировка всей таблицы, блокировка блока данных, блокировка одной записи, блокировка страницы индекса и т.д.). Они используются как при внесении изменений в БД (не важно каким образом: одним запросом или в транзакции), так и чтении данных из БД. Какая именно блокировка будет использоваться зависит от многого. Программист может контролировать этот процесс установкой различных уровней изоляции (TRANSACTION ISOLATION LEVEL).Duncon писал(а):Суть транзакций в выполнении большого количества запросов, при этом блокируется таблица, для 2 запросов это бессмысленно больше времени уйдёт на блокировку...
В даном случае даже без блокировки внесёться конкретное значение исходя из очереди кто первый, провторов быть не может - смысл в транзакции нулевой...
[syntax=Delphi] [/syntax]