MySQL - вставить в три таблицы - PullRequest
2 голосов
/ 12 ноября 2009

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

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

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

Мое выбранное решение было:

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

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

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 12 ноября 2009

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

EDIT:

Вот пример хранимой процедуры с транзакцией. Обратите внимание на использование 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', 'me@somewhere.com', 1);
1 голос
/ 12 ноября 2009

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

1 голос
/ 12 ноября 2009

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

...