MySQL при обновлении дубликата ключа не обновляется

#mysql #sql #unique-key

#mysql #sql #уникальный ключ

Вопрос:

Я пытаюсь использовать обновление дубликата ключа, но это не влияет ни на какие строки.

Моя инструкция создания таблицы, где вы можете видеть, что я создал уникальный ключ для дочернего идентификатора и даты.

 CREATE TABLE `history_childfees` (
    `childid` int(11) DEFAULT NULL,
    `date` date DEFAULT NULL,
    `amount` decimal(10,2) DEFAULT NULL,
    `feetypecode` varchar(45) DEFAULT NULL,
    UNIQUE KEY `key_childdate` (`childid`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  

Это две строки, которые у меня есть в таблице.

введите описание изображения здесь

Строка, которую я пытаюсь обновить, является первой строкой, путем изменения количества для дочернего элемента 86615 в 2019-03-22.

 insert into history_childfees (childid,date,amount,feetypecode)
values(86615,'2019-03-22',50,'DAY')
on duplicate key update childid = 86615, date = '2019-03-22';
  

Я также пробовал этот синтаксис.

 insert into history_childfees (childid,date,amount,feetypecode)
values (86615,'2019-03-22',50,'DAY')
on duplicate key update childid = values(childid), date = values(date);
  

В любом случае, он не выполняет вставку, и при выполнении ошибки нет, но это влияет на 0 строк. Чего мне здесь не хватает?

Комментарии:

1. Итак, вы пытаетесь изменить его на то, что оно уже есть?

2. Нет, я пытаюсь изменить количество на 50.

3. Итак, теперь вы знаете, что делать.

4. Я понял. Я думал, что столбцы после «обновления ключа» должны были быть ключевыми столбцами, но на самом деле это столбцы, которые я хочу обновить. Странный синтаксис.

5. На самом деле, что-то странное происходит, когда я запускаю это на своем сервере. !?!?!

Ответ №1:

Рассмотрим:

 CREATE TABLE `history_childfees` (
    ...  
    UNIQUE KEY `key_childdate` (`childid`,`date`)
);
  

И:

 insert into history_childfees
...
on duplicate key update childid = 86615, date = '2019-03-22'
  

Столбцы, которые вы обновляете при обновлении дублирующего ключа, в точности соответствуют тем, UNIQUE KEY которые вы используете для идентификации дубликатов. По замыслу мы уже знаем, что значения действительно совпадают… Как следствие, запрос оставляет дублирующиеся записи неизмененными.

Если я правильно вас понял, вы, вероятно, хотите:

 insert into history_childfees
...
on duplicate key update amount = 50
  

Комментарии:

1. Да, я неправильно понял синтаксис. Спасибо.