Все дизайнеры MySQL генерируют неправильный код при изменении представления - PullRequest
0 голосов
/ 07 февраля 2012

У меня отлично работает MySQL View:

SELECT `t`.`TraderId` AS `TraderId`,`t`.`ShopName` AS `ShopName`,`t`.`UserId` AS `UserId`,`t`.`CreatedOn` AS `CreatedOn`,`t`.`MOL` AS `MOL`,`u`.`Phone` AS `Phone`,`u`.`Email` AS `Email`,`rt`.`Name` AS `RentType`,(
SELECT SUM(`o`.`Ammount`) AS `AmmountSum`
FROM `Orders` `o`
WHERE (`o`.`TraderId` = `t`.`TraderId`)) AS `Revenue`,(
SELECT SUM(`o`.`Ammount`) AS `SUM(o.Ammount)`
FROM `Orders` `o`
WHERE ((MONTH(`o`.`DeliveryDate`) = MONTH(CURDATE())) AND (YEAR(`o`.`DeliveryDate`) = YEAR(CURDATE())) AND (`o`.`TraderId` = `t`.`TraderId`))) AS `MonthRevenue`,(`t`.`RatingSum` / `t`.`RatingVotes`) AS `Rating`,(
SELECT CASE `rt`.`IsMonthlyBased` WHEN 1 THEN (
SELECT ( (12 * ((YEAR(CURDATE()) 
              - YEAR(`t`.`LastPaidDate`))) 
       + (MONTH(CURDATE()) 
           - MONTH(`t`.`LastPaidDate`))) * `rt`.`Tax`)) END) AS  `Debt`
FROM ((`Traders` `t`
LEFT JOIN `Users` `u` ON((`u`.`UserId` = `t`.`UserId`)))
LEFT JOIN `RentTypes` `rt` ON((`rt`.`RentTypeId` = `t`.`RentTypeId`)))

Я не знаю, как отформатировать код, так что если вы можете скопировать и вставить его в редактор и увидеть его.Спасибо.

Итак, представление работает.Но когда вы переходите к любому конструктору (heideSql, workBench, navicat) и нажимаете на вид alter, скрипт представления генерируется неправильно:

SELECT `t`.`TraderId` AS `TraderId`,`t`.`ShopName` AS `ShopName`,`t`.`UserId` AS `UserId`,`t`.`CreatedOn` AS `CreatedOn`,`t`.`MOL` AS `MOL`,`u`.`Phone` AS `Phone`,`u`.`Email` AS `Email`,`rt`.`Name` AS `RentType`,(
SELECT SUM(`o`.`Ammount`) AS `AmmountSum`
FROM `Orders` `o`
WHERE (`o`.`TraderId` = `t`.`TraderId`)) AS `Revenue`,(
SELECT SUM(`o`.`Ammount`) AS `AmmountSumMonth`
FROM `Orders` `o`
WHERE ((MONTH(`o`.`DeliveryDate`) = MONTH(CURDATE())) AND (YEAR(`o`.`DeliveryDate`) = YEAR(CURDATE())) AND (`o`.`TraderId` = `t`.`TraderId`))) AS `MonthRevenue`,(`t`.`RatingSum` / `t`.`RatingVotes`) AS `Rating`,(
SELECT (CASE `rt`.`IsMonthlyBased` WHEN 1 THEN (
SELECT (((12 * (YEAR(CURDATE()) - YEAR(`t`.`LastPaidDate`))) + (MONTH(CURDATE()) - MONTH(`t`.`LastPaidDate`))) * `rt`.`Tax`) AS `( (12 * ((YEAR(CURDATE()) 
              - YEAR(``t``.``LastPaidDate``))) 
       + (MONTH(CURDATE()) 
           - MONTH(``t``.``LastPaidDate``))) * ``rt``.``Tax``)`) END) AS `CASE ``rt``.``IsMonthlyBased`` WHEN 1 THEN (
SELECT ( (12 * ((YEAR(CURDATE()) 
              - YEAR(``t``.``LastPaidDate``))) 
       + (MONTH(CURDATE()) 
           - MONTH(``t``.``LastPaidDate``))) * ``rt``.``Tax``)) END`) AS `Debt`
FROM ((`Traders` `t`
LEFT JOIN `Users` `u` ON((`u`.`UserId` = `t`.`UserId`)))
LEFT JOIN `RentTypes` `rt` ON((`rt`.`RentTypeId` = `t`.`RentTypeId`)))

Мой последний столбец выбора генерируется дважды, появляются двойные кавычки (``)и так далее.Так где же моя ошибка?

1 Ответ

1 голос
/ 07 февраля 2012

Представления MySQL хранятся в формате, который быстро анализируется и выполняется MySQL, но в отличие от хранимых процедур, текст, введенный вами для создания представления, НЕ сохраняется. Код, который извлекает дизайнер, должен исполняться так же, как ваш исходный запрос.

Ключ заключается в том, чтобы сохранить операторы CREATE VIEW в файлах .sql, а когда вы хотите изменить представление, откройте этот файл, измените, затем скопируйте и вставьте в MySQL.

...