Ошибка "The target table *** of the INSERT is not insertable-into" при добавлении данных через VIEW
Использую MySQL. Данные хранятся в двух связанных таблицах и через представление Бронирования2
объединяются через JOIN и становятся доступны программе.
/* Первая таблица */
CREATE TABLE IF NOT EXISTS `Бронирования` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Дата заезда` date NOT NULL,
`Дата выезда` date NOT NULL,
`Источник` int(11) NOT NULL DEFAULT '0',
`Стоимость за сутки` int(11) NOT NULL DEFAULT '0',
`Примечания` varchar(2048) NOT NULL DEFAULT '0',
`Возврат` int(11) NOT NULL DEFAULT '0',
`Процент комиссии сайта` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `Источник` (`Источник`),
CONSTRAINT `FK_Бронирования_Источники` FOREIGN KEY (`Источник`) REFERENCES `Источники` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;
INSERT INTO `Бронирования` (`ID`, `Дата заезда`, `Дата выезда`, `Источник`, `Стоимость за сутки`, `Примечания`, `Возврат`, `Процент комиссии сайта`) VALUES
(24, '2023-04-26', '2023-04-29', 3, 3500, '', 0, 20),
(25, '2023-04-29', '2023-04-30', 6, 3500, 'Это комментарий...', -100, 0),
(26, '2023-05-06', '2023-05-07', 1, 3500, '', 0, 0),
(27, '2023-05-30', '2023-09-09', 1, 2800, '', 0, 0),
(28, '2023-09-18', '2023-09-21', 5, 3000, 'Это тоже комментарий', 2550, 15),
(29, '2023-09-21', '2023-09-29', 1, 3000, '', 0, 15),
(30, '2023-10-13', '2023-10-17', 4, 3000, '', 0, 25);
/* Вторая таблица (связаная) */
CREATE TABLE IF NOT EXISTS `Источники` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Название` varchar(50) DEFAULT NULL,
`Процент комиссии` int(11) NOT NULL DEFAULT '0',
`URL Синхронизации календаря` varchar(1024) DEFAULT NULL,
`Цена за сутки` int(11) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
INSERT INTO `Источники` (`ID`, `Название`, `Процент комиссии`, `URL Синхронизации календаря`, `Цена за сутки`) VALUES
(0, 'Другое', 0, '', 3000),
(1, 'Авито', 15, 'https://www.avito.ru/calendars-export/******', 3200),
(2, 'Твил', 30, 'https://tvil.ru/entity/ical/ics/******', 3700),
(3, 'Суточно', 20, 'https://sutochno.ru/calendar/ical/*******', 3200),
(4, 'квартиры-посуточно', 0, '', 2800),
(5, 'Мир Квартир', 0, '', 2800),
(6, 'Продление', 0, '', 3000),
(7, 'Яндекс Недвижимость', 0, '', 2900);
/* Представление */
CREATE ALGORITHM=UNDEFINED SQL SECURITY DEFINER VIEW `Бронирования2` AS
SELECT `Бронирования`.`ID` AS `ID`,
`Бронирования`.`Дата заезда` AS `Дата заезда`,
`Бронирования`.`Дата выезда` AS `Дата выезда`,
(to_days(`Бронирования`.`Дата выезда`) - to_days(`Бронирования`.`Дата заезда`)) AS `Дней`,
`Источники`.`Название` AS `Источник`,
`Бронирования`.`Источник` AS `ID источника`,
`Бронирования`.`Стоимость за сутки` AS `Стоимость за сутки`,
((to_days(`Бронирования`.`Дата выезда`) - to_days(`Бронирования`.`Дата заезда`)) * `Бронирования`.`Стоимость за сутки`) AS `Полная стоимость`,
`Бронирования`.`Процент комиссии сайта` AS `Процент комиссии сайта`,
((((to_days(`Бронирования`.`Дата выезда`) - to_days(`Бронирования`.`Дата заезда`)) * `Бронирования`.`Стоимость за сутки`) * ifnull(`Бронирования`.`Процент комиссии сайта`, 0)) / 100) AS `Комиссия сайта`,
`Бронирования`.`Возврат` AS `Возврат`,
(((((to_days(`Бронирования`.`Дата выезда`) - to_days(`Бронирования`.`Дата заезда`)) * `Бронирования`.`Стоимость за сутки`) * (100 - ifnull(`Бронирования`.`Процент комиссии сайта`, 0))) / 100) - ifnull(`Бронирования`.`Возврат`, 0)) AS `Доход`,
`Бронирования`.`Примечания` AS `Примечания`
FROM `Бронирования`
JOIN `Источники`
ON `Бронирования`.`Источник` = `Источники`.`ID`
/*order by `Бронирования`.`Дата заезда`*/;
Проблема в том, что не могу добавлять данные через представление.
insert into `Бронирования2` (`ID`, `Дата заезда`,`Дата выезда`,`ID источника`,
`Стоимость за сутки`,`Процент комиссии сайта`,`Возврат`,`Примечания`)
values (999, '2024-08-01','2024-08-15',6,3000,0,0,'Это новая запись');
Ошибка:
The target table Бронирования2 of the INSERT is not insertable-into
Странно, учитывая что UPDATE-запрос работает. Например:
update `Бронирования2` set `Стоимость за сутки`=999, `Примечания`='Эта запись изменена'
where (`ID`= 30);
Демо: https://onecompiler.com/mysql/42nu9kmsx