Используйте ОБНОВЛЕНИЕ при ДУБЛИРОВАНИИ КЛЮЧА для обновления строки с помощью MySQL

#mysql

#mysql

Вопрос:

У меня есть следующая структура таблицы:

Таблица ___Availabilities :

 |--------|------------|------------|------------|
| AVA_Id | AVA_RoomId | AVA_Date   | AVA_Status |
|--------|------------|------------|------------|
|      1 |         47 | 2019-03-11 |     NoData |
|      2 |         48 | 2019-03-22 |       Book |
|      3 |         48 | 2019-03-23 |       Book |
|--------|------------|------------|------------|
  

Я хочу ОБНОВИТЬ, AVA_Status только если AVA_RoomId и AVA_Date известны в строке таблицы. Если нет, вставьте новую строку.

Итак, мой запрос такой:

 INSERT INTO ___Availabilities 
    (AVA_Id, AVA_RoomId, AVA_Date, AVA_Status) 
    VALUES('', '103', '2019-04-04', 'Open')
ON DUPLICATE KEY UPDATE
    `AVA_RoomId`='47',
    `AVA_Date`='2019-03-11'
  

Но это не работает, поскольку оно добавило новую строку, тогда как оно должно обновить строку where AVA_RoomId = 47 и AVA_Date = 2019-03-11 .

Пожалуйста, почему мой запрос не работает?

Спасибо.

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

1. Является ли AVA_Id это AUTO_INCREMENT столбец?

2. @Quasimodo’sclone, да, это так.

3. Вам нужен уникальный индекс для столбцов, которым вы хотите сопоставить ON DUPLICATE KEY .

4. Есть ли у вас уникальный индекс на (AVA_RoomId, AVA_Date) ?

5. Это не может сработать, поскольку ключ не будет дублироваться.

Ответ №1:

Предполагая, что существует UNIQUE INDEX(AVA_RoomId, AVA_Date)

Возможно, вы захотите обновить AVA_Status , когда комбинация номера и даты уже существует:

 INSERT INTO ___Availabilities 
    (`AVA_RoomId`, `AVA_Date`, `AVA_Status`) 
    VALUES('103', '2019-04-04', 'Open')
ON DUPLICATE KEY UPDATE
    `AVA_Status` = VALUES(`AVA_Status`),
  

Как уже объяснял @Barmar, если это еще не сделано, вы все равно можете добавить индекс после создания таблицы:

 ALTER TABLE `___Availabilities`
  ADD UNIQUE INDEX `uq_room_date` (`AVA_RoomId`, `AVA_Date`)
;
  

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

1. Здравствуйте, означает ли это, что AVA_RoomId и AVA_Date должны быть уникальными? Потому что это будет не так, поскольку у меня будет более одной строки для одного и того же roomId, но с несколькими разными датами.

2. конечно, или может быть распознан новый дублирующий индекс.

3. @Testy Я предполагаю, что вы хотите обновить значение, предоставленное insert вместо константы. Смотрите обновление.

4. Это работает. Как я могу управлять AVA_Id поскольку это поле с автоматическим увеличением?

5. @Testy Чем вы хотите управлять? Она генерируется автоматически, как указывают слова «автоматическое увеличение». Возможно, вам захочется SELECT LAST_INSERT_ID(); `