mySQL - вставить в три таблицы

Недавно я задал этот вопрос.

У меня есть реляционная база данных с тремя таблицами. Первый содержит идентификаторы, относящиеся ко второму. Второй содержит идентификаторы, относящиеся к третьему. Третий содержит результаты, которые мне нужны.

Можно ли с помощью одного запроса запросить идентификатор в первой таблице, который дает все результаты из третьей таблицы, относящиеся к ней?

Я выбрал следующее решение:

выберите * из таблицы 1 t1 присоединиться к таблице 2 t2 на t1.t2ref = t2.id присоединиться к таблице 3 t3 на t2.t3ref = t3.id

Добавьте предложение where для поиска определенных строк в таблице 1.

где t1.field = 'значение'

Мой новый вопрос:

Я понял, что мне нужно вставить в три таблицы тоже. Я имею дело с системой бронирования. Можно ли написать запрос, который вставляется в три таблицы сразу после их запроса (с использованием соединений?).

Также у меня есть еще одно соображение: следует ли использовать транзакции, чтобы гарантировать, что два запроса выполняются одновременно... оба обнаруживают, что идентификаторы «незарезервированы», а затем приводят к двойному бронированию или есть более простой способ?


person Mark    schedule 12.11.2009    source источник


Ответы (3)


Вы обязательно должны сделать три вставки в транзакции. Я бы, вероятно, написал хранимую процедуру для обработки вставок.

РЕДАКТИРОВАТЬ:

Вот пример хранимой процедуры с транзакцией. Обратите внимание на использование LAST_INSERT_ID() для получения идентификатора ранее вставленной записи. Это всего две таблицы, но вы сможете расширить ее до трех таблиц.

DELIMITER //
CREATE PROCEDURE new_engineer_with_task(
  first CHAR(35), last CHAR(35), email CHAR(255), tool_id INT)
BEGIN
START TRANSACTION;
   INSERT INTO engineers (firstname, lastname, email) 
     VALUES(first, last, email);

   INSERT INTO tasks (engineer_id, tool_id) 
     VALUES(LAST_INSERT_ID(), tool_id);
COMMIT;
END//
DELIMITER ;

И вы называете это так:

CALL new_engineer_with_task('Jerry', 'Fernholz', '[email protected]', 1);
person Jerry Fernholz    schedule 12.11.2009
comment
Извините, я никогда раньше не использовал транзакции... как написать хранимую процедуру? - person Mark; 12.11.2009
comment
@Mark Вы можете использовать MySQL Workbench и дважды щелкнуть «Добавить процедуру», или вы можете использовать CLI «mysql -u [имя пользователя] -p [имя базы данных]», а затем введите код, написанный Джерри. - person Ben; 28.09.2012

Вы не можете вставлять в несколько таблиц один запрос, вам придется разбить его на несколько запросов.

person GSto    schedule 12.11.2009

Вы всегда используете транзакции при выполнении нескольких обновлений. Если одно обновление завершится ошибкой, вы захотите откатить предыдущие успешные обновления, чтобы не нарушать какие-либо неиспользуемые ограничения реляционной модели.

person Chris Lacasse    schedule 12.11.2009
comment
Должен ли я использовать InnoDB для использования транзакций? - person Mark; 12.11.2009
comment
да. Или BDB, для которого, я думаю, MySQL отказывается от поддержки. InnoDB обеспечивает полное соответствие требованиям ACID, что вам и нужно. - person Chris Lacasse; 12.11.2009