2009-09-26 2 views
0

У меня есть 2 таблицы:Зависимые вставок данных в MySql таблицу

user_tb.username user_tb.point

review_tb.username review_tb.review

Я кодирование с PHP (CodeIgniter). Поэтому я пытаюсь вставить данные в review_tb с обзором, который пользователь представил, и если это будет успешным, я буду награждать пользователя некоторыми очками.

Ну, это похоже на очень простой процесс. Сначала мы вставим обзор в обзор_tb с именем пользователя и используем PHP, чтобы проверить, есть ли какие-либо проблемы с выполненным запросом, и если это будет успешным, мы продолжим обновление точек в user_tb.

Да, но здесь возникает проблема. Что делать, если вставка в review_tb является успешной, но второй запрос, вставляемый в user_tb, НЕ является успешным, можем ли мы отменить «отзыв» или «вернуть» изменение, которое мы сделали для review_tb.

Это похоже на «все или ничего».

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

Просьба дать некоторое просветление о том, как мы можем это сделать в PHP или CodeIgniter или просто в запросе MySql.

ответ

3

Если вы хотите поведение «все или ничего» для ваших операций SQL, вы ищете transactions; вот соответствующая страница из руководства по MySQL: 12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax.

Википедия описывает те, таким образом:

Транзакция базы данных содержит единицу работы, выполняемой в рамках системы управления в базы данных (или подобная система) с базой данных, и обрабатывают в когерентный и надежный способ не зависит от других транзакций. Операции в среде базы данных имеют две основные цели:

  1. Чтобы обеспечить надежные единицы работы, которые позволяют корректное восстановление из неудач и сохранить базу данных соответствует даже в случае системы недостаточности, когда выполнение останавливается (полностью или частично), и многие операции по базе данных остаются незавершенными, с неясным статусом.
  2. Для обеспечения изоляции между программами, обращающимися к базе данных одновременно.Без изоляции результаты программ обычно ошибочны.


В основном:

  • вы начать транзакцию
  • вы делаете то, что вам нужно; т.е. ваша первая вставка и ваше обновление
  • если все в порядке, вы совершаете транзакцию
  • else, если есть какие-либо проблемы с любыми вашими запросами, вы откатываете транзакцию; и он отменит все, что вы сделали в этой транзакции.

Существует страница справочника о transactions and CodeIgniter here.


Обратите внимание, что при использовании MySQL каждый двигатель поддерживает транзакцию; между двумя наиболее часто используемыми двигателями, MyISAM не поддерживает транзакции, в то время как InnoDB поддерживает их.

0

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

Try что-то вроде

BEGIN; 
INSERT INTO review_tb(username, review) VALUES(x, y); 
INSERT INTO user_tb(username, point) VALUES(x, y); 
COMMIT; 

Обратите внимание, что вы должны использовать ядро ​​базы данных, который поддерживает транзакции (например, InnoDB).

0

Если у вас есть поддержка InnoDB использовать его, но когда его не возможно, вы можете использовать код, подобный следующему:

$result=mysql_query("INSERT INTO ..."); 
if(!$result) return false; 

$result=mysql_query("INSERT INTO somewhereelse"); 
if(!$result) { 
     mysql_query("DELETE FROM ..."); 
     return false; 
} 

return true; 

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

+1

Да, я действительно думал об этом решении, но понял: «Эта очистка может все еще не срабатывать ........ неожиданные окончания» – user179432

Смежные вопросы