2013-02-06 2 views
3

Использование MySQL в одиночку - Если я базовое обновление таблицы вроде этого:Codeigniter db-> обновление() VS MySQL родной UPDATE изменяемых строк: 0

UPDATE `SOMETABLE` SET `NAME` = 'John' WHERE `ID` = 1; 

и значение NAME = "Джона 'еще был' John '- другими словами - ничего нового, ничего не обновляйте. MySQL возвращает "Затронутые ряды: 0 (запрос занял 0.0007 сек)"

Если я один и тот же вызов - теперь с помощью CodeIgniter - и затем извлечь пораженные строки так:

$data = array(
       'NAME' => 'John' 
      ); 

$this->db->where('ID', 1); 
$this->db->update('SOMETABLE', $data); 
$affect = $this->db->affected_rows(); 

echo $affect; // $affect echos 1 

$ влияет на заканчивается равным 1. У меня нет проблем с этим - я просто ожидал, что если нечего обновлять - этот кодигнитор будет вести себя так же, как MySQL, и не редактировать что-то, что не нужно обновлено и возвращает 0 для affected_rows().

  • Есть ли у меня такое неправильное?
  • Является ли переписывание кодеригентов 'John'? или нет?
+0

Просто любопытство здесь:.? Почему вы передавая идентификатор в виде строки? –

+1

Основываясь на ваших выводах, я задаюсь вопросом, что такое нагрузка (я понимаю nil на таком базовом запросе). Очевидно, что MySQL бьет по db и в основном делает выбор, чтобы узнать, требуется ли обновление, а затем обновление, если необходимо. просто делает обновление. Я предполагаю, что выбор выполняется быстрее/менее ресурсоемким, чем обновление. Хороший вопрос. 1-up – dmayo

+0

My Bad - Это предложение от @Dwight с $ this-> db-> last_query(); (DATE_RFC822) добавлено – KDawg

ответ

3

Попробуйте получить запрос, который CodeIgniter запущен, используя следующий код:

$this->db->last_query(); 

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

У CodeIgniter есть хак для MySQL, который настраивает отчетность по затронутым строкам, однако я был под впечатлением, что это было только для запросов DELETE. Если вы посмотрите на system/database/drivers/mysql/mysql_driver.php или system/database/drivers/mysqli/mysqli_driver.php (в зависимости от того драйвера вы используете и посмотреть на переменную var $delete_hack = TRUE; регулировочные, которые могут повлиять на ваш результат, может быть стоит попробовать

+1

Функция Codeigniter только: function affected_rows() { \t \t return @mysql_affected_rows ($ this-> conn_id); } Поэтому я считаю, что это ваш запрос – jmadsen

+1

My Bad - Это предложение от @Dwight с $ this-> db-> last_query(); заставил меня найти мою ошибку. У меня была дата даты (DATE_RFC822), добавленная в середине звонка, и я упустил ее из виду ... Мой плохой ... Я чувствую себя смущенным сейчас :(- Но действительно рад, что вы, ребята, помогли ... Что мы делаем этот вопрос сейчас? Я не хочу смущать кого-либо этим. – KDawg

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