MYSQL, PHP Вставка в несколько таблиц в базе данных - PullRequest
1 голос
/ 16 февраля 2011

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

  $query = "INSERT INTO users (grp, email, college_id, tutor, year, password, register_date) VALUES ('$g', '$e', '$ci', '$tu', '$y', PASSWORD('$p'), NOW() )";
  $query2 = "INSERT INTO unit_26 (college_id) VALUES ('$ci')";
  $result = mysql_query ($query); // Run the Query Now woooo. 
  $result2 = mysql_query ($query2); // Run the Query Now woooo. 
  if ($result) { // If it Ran OK.

Хотя это работает и информация добавляется в обе таблицыбыло просто интересно, если у кого-то есть лучший способ сделать это, или этот путь не так?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

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

Является ли это проблемой или нет, зависит от логики приложения. В вашем случае это сложно сказать без дополнительной информации. Возможно нет. Финансовые операции с двумя счетами - это пример, в котором является проблемой: вы не хотите, чтобы сумма всех остатков на счетах была неправильной в любое время.

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

$result = FALSE;
if (mysql_query('BEGIN')) {
    if (mysql_query($query1) &&
        mysql_query($query2))
        $result = mysql_query('COMMIT'); // both queries looked OK, save
    else
        mysql_query('ROLLBACK'); // problems with queries, no changes
}

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

0 голосов
/ 16 февраля 2011

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

Может быть, было бы хорошо, если бы вы могли что-то вроде

INSERT INTO t1.id, t2.val, t3.other VALUES ($t1id, $t2val, $t3other);

но увы ...

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