Есть ли способ сопоставления строк?(в дополнение к затронутым строкам) - PullRequest
0 голосов
/ 22 января 2019

После выполнения запроса на обновление в сохраненной процедуре:

Update table1 set value='a' where id=1

, если в таблице уже есть идентичная строка (с id = 1 и значением = 'a'), я получаю следующее сообщение:

0 затронутых строк, Соответствие строк: 1 Изменено: 0 Предупреждений: 0

Когда я проверяю ROW_COUNT(), возвращается 0, так как он возвращаетзатронутые ряды.Итак, есть ли способ узнать, были ли сопоставленные строки, используя способ, аналогичный ROW_COUNT() (или любым другим способом с использованием скриптов)?

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Вы можете получить доступ к той же сводке операций напрямую, используя mysql_sysinfo().

Альтернативным решением может быть добавление в таблицу столбца, который вы всегда будете обновлять при запуске оператора. Следовательно, даже если столбец value не изменится, строки всегда будут затронуты, поскольку другой столбец изменится.

Это может быть столбец отметки времени, который вы бы обновили до NOW(), например:

update table1 set value = 'a', my_timestamp = NOW() where id=1;

Или целочисленный столбец, который вы автоинкрементите:

update table1 set value = 'a', my_revision = my_revision + 1 where id=1;
0 голосов
/ 26 января 2019

Посмотрите на это так - два оператора SQL почти всегда медленнее, чем один.

Давайте разберем IODKU:

  1. Развернем все UNIQUE BTrees (включая PK) допосмотреть, если запись существует.
  2. Либо ...
    2а.Если существует, ОБНОВИТЬ найденную запись.
    2b.Если не существует, ВСТАВЬТЕ новую запись.Обратите внимание, что уникальные BTree подготовлены и готовы принять новые записи, и INSERT не нужно проверять.

Versus:

SELECT COUNT (*):

  1. Разверните несколько уникальных BTree, чтобы найти строку.
  2. Проверьте, сколько строк применяется.

EXISTS (SELECT 1 ...)

  1. Просверлите немного УНИКАЛЬНОГО BTree, чтобы найти строку.
  2. Верните true или false.

INSERT

  1. Разверните все UNIQUEBTrees (включая PK), чтобы увидеть, если запись существует.(звучит знакомо?)
  2. Либо ...
    2a.Если существует, выдайте дубликат ошибки ключа
    2b.Performa INSERT.(звучит знакомо?)

ОБНОВЛЕНИЕ

  1. Найдите запись, основанную на предложении WHERE - возможно, идентичную детализации BTree, упомянутой выше.
  2. Изменить строки.

Обратите внимание, как IODKU

  • Предотвращает дублирование усилий
  • Избегает (дорогостоящего) второго SQL.

Кстати, REPLACE является плохим родственником:

  1. УДАЛИТЬ все строки с одинаковыми УНИКАЛЬНЫМИ ключами (ключами)
  2. УДАЛИТЬ все строкис тем же ПЕРВИЧНЫМ КЛЮЧОМ.
  3. INSERT (возможно, возвращая идентичные ключи!)
0 голосов
/ 22 января 2019

ROW_COUNT() получить количество затронутых строк по умолчанию. Но вы можете изменить это поведение с помощью mysql_real_connect(). Если вы установите его на CLIENT_FOUND_ROWS, вы можете получить количество найденных строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...