Codeigniter db- ›update () VS MySQL собственное ОБНОВЛЕНИЕ Затронутые строки: 0

Использование только MySQL - если я сделаю базовое обновление для такой таблицы:

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

И значение NAME = 'John' уже было '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

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

  • Я что-то неправильно понял?
  • Codeigniter перезаписывает "John"? или не?

person Community    schedule 06.02.2013    source источник
comment
Просто любопытство: почему вы передаете идентификатор в виде строки?   -  person Joseph Silber    schedule 06.02.2013
comment
Основываясь на ваших выводах, мне интересно, какова нагрузка (я понимаю, что на таком базовом запросе нет). Очевидно, MySQL попадает в базу данных и в основном делает выбор, чтобы увидеть, требуется ли обновление, а затем обновление, если это необходимо. Тогда как CI просто делает обновление. Я предполагаю, что выбор выполняется быстрее / требует меньше ресурсов, чем обновление. Хороший вопрос. 1-на   -  person dmayo    schedule 06.02.2013
comment
Мое плохое - это предложение от @Dwight с помощью $ this- ›db-› last_query (); заставил меня найти мою ошибку. У меня была добавлена ​​дата отметки времени (DATE_RFC822)   -  person    schedule 06.02.2013


Ответы (1)


Попробуйте получить запрос, который выполняет 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;. Регулировка, которая может повлиять на ваш результат, стоит ли попробовать?

person Dwight    schedule 06.02.2013
comment
Функция Codeigniter - это только: function enabled_rows () {return @mysql_affected_rows ($ this- ›conn_id); } Итак, я считаю, что это ваш запрос - person jmadsen; 06.02.2013
comment
Мое плохое - это предложение от @Dwight с помощью $ this- ›db-› last_query (); заставил меня найти мою ошибку. У меня была дата с отметкой времени (DATE_RFC822), добавленная в середине разговора, и я пропустил ее ... Плохо ... Мне сейчас неловко :( - Но очень рад, что вы, ребята, помогли ... Что нам делать с этот вопрос сейчас? Я не хочу никого путать с этим. - person ; 06.02.2013