Intereting Posts
Как получить статус выполнения функции копирования в PHP? Случайно выберите элемент в массиве, затем удалите из массива Каков самый простой способ увидеть имя файла содержимого веб-сайта? Ошибка в объявлении объекта при расширении класса PDO Хеши SHA512 различаются по андроиду, php и javascript Извлечение значения из текстового поля в форме (представлении) в контроллер в codeigniter php при выборе selectbox Как взаимодействовать с PKCS # 11 совместимым устройством HSM в PHP Codeigniter не работает? Добавление месяцев в DateTime с DateInterval изменяет исходную дату для соответствия новой дате Создать набор всех возможных совпадений для заданного регулярного выражения ContextErrorException после создания пакета в Symfony simpleXML и акцентированные символы в PHP Пример мультипорта / формы данных в тонкой микроструктуре Коммутатор не работает с числовыми случаями сравнения Может ли solr обслуживать отдельные документы, такие как CMS?

MYSQL, PHP Вставка в несколько таблиц в базе данных

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

$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); 

но увы…