SQL Вставка не работает с несколькими условиями WHERE - PullRequest
0 голосов
/ 03 августа 2020

У меня есть запрос на обновление на основе 4 условий WHERE. Когда я выполняю это, я обновляю 0 записей. Я запутался, потому что есть запись, отвечающая этим условиям.

Запрос:

UPDATE tp_margins
    SET cost = '139.00',
        updated = '2020-08-03 16:00:53'
 WHERE itemNumber='LATITUDE 5480' AND ff='TOUCH' AND proc='i5' AND category='LAPTOP'

Если я удалю WHERE ff, он обновится, но все записи, соответствующие игнорированию ff. вот таблица:

CREATE TABLE `tp_margins` (
  `margins_ID` int(11) NOT NULL,
  `itemNumber` varchar(80) NOT NULL,
  `ff` varchar(30) DEFAULT NULL,
  `proc` varchar(30) DEFAULT NULL,
  `sku` varchar(140) NOT NULL,
  `category` varchar(40) NOT NULL,
  `cost` decimal(8,2) NOT NULL,
  `shipping` decimal(8,2) DEFAULT NULL,
  `opex` decimal(8,2) DEFAULT NULL,
  `hdd` decimal(8,2) DEFAULT NULL,
  `ram` decimal(8,2) DEFAULT NULL,
  `kbm` decimal(8,2) DEFAULT NULL,
  `coa` decimal(8,2) DEFAULT NULL,
  `salePrice` decimal(8,2) NOT NULL,
  `updated` varchar(40) DEFAULT '--------'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Что-то я делаю не так с этим Mysql Update?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

MySQL сообщит «0 затронутых строк», если оператор UPDATE соответствует одной (или нескольким) строкам, а строки, подлежащие обновлению, фактически не изменяются с помощью UPDATE ... то есть, если мы устанавливаем столбцы на текущее значение.

Проверьте условия в предложении WHERE в операторе SELECT.

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

Мы могли бы протестировать ОБНОВЛЕНИЕ со значением, которое действительно меняет значение в столбце, а затем изменить его обратно на то, что мы хотим. (Следует также упомянуть, что оператор UPDATE будет запускать любые TRIGGER до / после обновления, если влияние триггеров имеет значение.)

Ссылка:

https://dev.mysql.com/doc/c-api/8.0/en/mysql-affected-rows.html

"Для операторов UPDATE значение затронутых строк по умолчанию - это количество фактически измененных строк. Если вы укажете Флаг CLIENT_FOUND_ROWS для mysql_real_connect () при подключении к mysqld, значение затронутых строк - это количество «найденных» строк, то есть сопоставленных с предложением WHERE. "

0 голосов
/ 03 августа 2020

У вас нет строки. Вы можете начать с поиска совпадений:

SELECT m.*
FROM tp_margins m
WHERE m.itemNumber = 'LATITUDE 5480' AND m.proc = 'i5' AND m.category = 'LAPTOP' AND
      m.ff = 'TOUCH'

Когда это ничего не вернет, вы должны спросить, почему. Я бы рекомендовал использовать LIKE, чтобы увидеть, какие есть похожие значения:

SELECT m.*
FROM tp_margins m
WHERE m.itemNumber = 'LATITUDE 5480' AND m.proc = 'i5' AND m.category = 'LAPTOP' AND
      m.ff LIKE '%TOUCH%'

Могут быть причины, по которым строки выглядят одинаково, но по-разному. Наиболее распространенными являются:

  • Начальные пробелы.
  • Невидимые символы.
  • Похожие символы (например, строчная L и цифра один).

Обратите внимание, что вы, кажется, хотите указать updated в качестве даты / времени. Это должно быть заявлено как таковое. Фактически, в MySQL вы можете настроить автоматическое обновление при обновлении строки.

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