Вставка в две таблицы одним запросом - PullRequest
0 голосов
/ 09 октября 2011

Я занимаюсь разработкой веб-приложения с использованием Zend Framework, и проблема в том, чтобы объединить запросы 2 sql для повышения эффективности. Моя структура таблицы выглядит следующим образом

>table message
id(int auto incr)
body(varchar)
time(datetime)

>table message_map
id(int auto incr)
message_id(forgain key from message table's id column)
sender(int ) comment 'user id of sender'
receiver(int) comment 'user id of receiver'

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

Ответы [ 5 ]

1 голос
/ 09 октября 2011

Нет, нет. Вы можете вставить только в одну таблицу одновременно.

Но я не могу представить, что вам нужно вставлять столько сообщений, что производительность действительно становится проблемой. Даже с этими отдельными утверждениями любая база данных может легко вставлять тысячи записей в минуту.

насыпные вкладыши
Конечно, при вставке нескольких записей в одну и ту же таблицу * 1008 это совсем другое дело. Это действительно возможно в MySQL, и это сделает ваш запрос намного быстрее. Однако это доставит вам неприятности, если вам понадобится insert_ids из всех этих записей.

mysql_insert_id () возвращает первый идентификатор, вставленный в последний оператор вставки, если это массовая вставка. Таким образом, вы можете запросить все идентификаторы, которые> = этот идентификатор. Он должен дать вам все записи, которые вы только что вставили, хотя результат может содержать идентификаторы, которые другие люди вставили между вашей вставкой и следующим запросом для этих идентификаторов.

0 голосов
/ 09 октября 2011

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

Теперь есть одна вещь, о которой вы можете беспокоиться. Представьте себе, вы сначала вставляете тело сообщения, а затем пытаетесь вставить идентификаторы получателя / отправителя. Предположим, что первый успешен, а второй (по какой-либо причине) потерпел неудачу. Это немного испортило бы ваши данные. Чтобы избежать этого, вы можете использовать транзакции, например

mysql_query("START TRANSACTION", $connection);
//your code
mysql_query("COMMIT", $connection);

Это гарантировало бы, что обе вставки попадают в базу данных, или нет. Если вы используете PDO, посмотрите примеры http://www.php.net/manual/en/pdo.begintransaction.php.

0 голосов
/ 09 октября 2011

Действительно, объединение этих двух вставок было бы невозможным. Пока вы используете JOIN в запросах get, вы не можете комбинировать запросы вставки. Если вы действительно беспокоитесь о производительности, разве нет возможности объединить эти две таблицы вместе? Насколько я понимаю, нет смысла держать их в стороне; там и про сообщение. Как указывалось ранее, выполнение второго запроса на вставку не так уж сильно загружает сервер.

0 голосов
/ 09 октября 2011

Я согласен с GolezTrol или иным образом, если вы хотите оптимизировать производительность для своего запроса, возможно, вы решите использовать хранимые процедуры

0 голосов
/ 09 октября 2011

, если это только для этих двух таблиц. Почему бы вам не создать одну таблицу, содержащую все эти столбцы в одном, как

>table message
id(int auto incr)
body(varchar)
sender(int ) comment 'user id of sender'
receiver(int) comment 'user id of receiver'
time(datetime)

тогда это будет так, как вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...