#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();
`