За последние 24 часа нас посетили 20650 программистов и 1012 роботов. Сейчас ищут 363 программиста ...

Как работает update, если значения столбцов совпадают с записываемым значение?

Тема в разделе "MySQL", создана пользователем Вероломство, 26 мар 2021.

  1. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    Оберни в транзакцию, чтобы с параллельных запросов не изгадили данные:
    PHP:
    1. PDO::beginTransaction();
    2. $user = User::findOne(1);
    3. //..... тут какая-то логика
    4. $user->save();
    5. PDO::commit();
    И твоя AR всё верно делает, если данные не изменились, не надо UPDATE.
    Но если изменились, UPDATE только изменённых полей лучше, чтобы, как уже написали, трафик от PHP в MySQL лишний не гонять, PHP и MySQL могут быть на разных серверах.
     
    Вероломство нравится это.
  2. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    я немного не так делаю :)

    PHP:
    1. $user = User::getBefore();
    2.  
    3. // теперь делаем где угодно и что угодно с $user-СВОЙСТВАМИ
    4.  
    5. // после того как сделали где угодно и что угодно с $user-СВОЙСТВАМИ делаем
    6.  
    7. $user = $user->getAfter(); // getAfter() содержит бработку некоторых событий и завершается $this->save();
    8.  
    9. $this->setVars(compact('user')); // полетели во вьюху
    никаких перекрёстных запросов :) после всех манипуляций с $user - свойствами, для объекта User будет выполнен только один save и только один раз )))

    а ты видимо передаёшь свойства User в какие-то методы и у тебя там после каждого изменения свойства ->save() долбится? ))) или я неправильно понял про перекрёстные запросы?

    у меня собираются все изменения в кучу и делается один save() И ТОЛЬКО с изменёнными столбцами-свойствами

    и как раз раньше тут не писали про трафик, писали наоборот что нужно просто делать апдейт и ничего не вычислять

    и ты неправильно вырезал мой код, мой пример выглядит так

    PHP:
    1. $user = User::findOne(1);
    2. $user->save(); // моя AR не сделает update, вообще ничего не сделает:)
    3. $user->login = 'Test';
    4. $user->save(); // моя AR сделает update ТОЛЬКО столбца `login`
     
    #27 Вероломство, 29 мар 2021
    Последнее редактирование: 29 мар 2021
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    Нет, я имел в виду, что к твоему скрипту могут 100 посетителей в секунду обращаться, в случае манипуляций с авторизованным юзером маловероятно, что будет дёргаться модель с одним и тем же id параллельно, но с другими изменяемыми данными очень даже.

    И это правильно.
     
  4. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    ты типа думаешь что есть какие-то базовые таблицы и при выборке по одному айдишнику из них может косяк вылезти?

    я хз как-то не думал об этом даже

    так в базовых таблах нет динамики же, там одни и те же данные будут в AR-объектах
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Ок, обновляй все поля кроме айдишника
     
    Вероломство нравится это.
  6. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    оставил, как я делал, ерунда это всё про какое-то игнорирование, буду апдейтить только изменённые
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    это не ерунда, потому что существует такое возвращаемое значение как num affected rows, количество обновленных строк. Если все поля совпали, то сервер вернёт 0. Никакой записи не произошло.
     
    Вероломство нравится это.
  8. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    запрос произошёл )))