Я пытаюсь вставить информацию в несколько таблиц в базе данных, мне удалось заставить ее работать, используя это:
$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.
Хотя он работает и информация добавляется к обеим таблицам, мне просто интересно, есть ли у кого-то лучший способ сделать это, или так неправильно?
благодаря
Поскольку эти две вставки выполняются независимо, другая программа, работающая одновременно, может видеть базу данных в состоянии, когда первая вставка выполнена, а вторая – нет.
Является ли это проблемой или нет, зависит от логики приложения. В вашем случае это сложно сказать без дополнительной информации. Возможно нет. Финансовые операции с двумя учетными записями являются примером, где это проблема: вы не хотите, чтобы сумма всех остатков на счете была неправильной в любое время.
Если вы считаете, что вам это нужно, вы можете сделать операцию атомом ценой производительности: другая программа либо увидит базу данных до первой вставки, либо после второй вставки. Он работает следующим образом:
$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 . В противном случае это будет бесшумно работать.
Вставки SQL предназначены только для одной таблицы. Вы не можете вставлять данные в две или более таблицы одновременно с одним запросом INSERT. Вы можете заставить отдельные вставки быть атомарными, используя транзакцию, но вам все равно нужно сделать INSERT для каждой таблицы.
Может быть, хорошо, если бы вы могли так что-то вроде
INSERT INTO t1.id, t2.val, t3.other VALUES ($t1id, $t2val, $t3other);
но увы…