2015-02-19 2 views
0

Я создаю таблицы:Почему mysql меняет мой код?

CREATE TABLE `table1` (
    `idtable1` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`idtable1`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `table2` (
    `idtable2` int(11) NOT NULL AUTO_INCREMENT, 
    `idtable1` int(11) DEFAULT NULL, 
    `table2col1` int(11) DEFAULT NULL, 
    `table2col2` int(11) DEFAULT NULL, 
    PRIMARY KEY (`idtable2`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

я создать представление:

CREATE VIEW `view1` AS 
select t2.* 
from table1 t1, table2 t2 
where t1.idtable1 = t2.idtable1 

когда Скомпилируйте MySQL изменить мой код:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER 
VIEW `view1` AS 
    select 
     `t2`.`idtable2` AS `idtable2`, 
     `t2`.`idtable1` AS `idtable1`, 
     `t2`.`table2col1` AS `table2col1`, 
     `t2`.`table2col2` AS `table2col2` 
    from 
     (`table1` `t1` 
     join `table2` `t2`) 
    where 
     (`t1`.`idtable1` = `t2`.`idtable1`) 

Есть ли способ избежать этого?

вот другой пример, нет ответа: Why is mysql rewriting my view queries?

MySQL добавляет ненужные скобки и поставить код на одной строке.

Даже при использовании правильного синтаксиса mysql измените представление, добавляя ненужные круглые скобки.

Оригинал:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER 
VIEW `view2` AS 
    select 
     `t2`.`idtable2` AS `idtable2`, 
     `t2`.`idtable1` AS `idtable1`, 
     `t2`.`table2col1` AS `table2col1`, 
     `t2`.`table2col2` AS `table2col2` 
    from 
     `table1` `t1` 
     left join `table2` `t2` on `t1`.`idtable1` = `t2`.`idtable1` 

Составитель:

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER 
VIEW `view2` AS 
    select 
     `t2`.`idtable2` AS `idtable2`, 
     `t2`.`idtable1` AS `idtable1`, 
     `t2`.`table2col1` AS `table2col1`, 
     `t2`.`table2col2` AS `table2col2` 
    from 
     (`table1` `t1` 
     left join `table2` `t2` ON ((`t1`.`idtable1` = `t2`.`idtable1`))) 
+2

Это переписывает его в правильный SQL. – Robbert

+2

Код эквивалентен. Удивительно, что MySQL использует * неправильный * SQL для перезаписи - предложение 'where' должно быть предложением' on'. Фактически, вы должны просто написать исходное представление, используя правильный синтаксис 'join'. –

+0

моя проблема в том, что даже при использовании правильного формата mysql меняет вид, добавляя круглые скобки и новые строки. Я всегда использовал sql-сервер, и это никогда не случается. – quimmo

ответ

1

То, что вы видите, это вопросы, вытекающие из SQL компилируется и затем декомпилированы.

human readable SQL -> compiled form -> human readable SQL 

Не волнуйтесь, это все эквивалентный код. Если вам нужен пример, напишите JSON вручную, запустите его через парсер JSON, а затем верните эти данные в JSON. Он не будет выглядеть так же, как оригинал.

Это распространенная проблема при преобразовании данных, известных как «круглое отключение». Без дополнительной работы теряется не-семантическая информация, такая как комментарии, отступы и скобки (или их отсутствие). MySQL также может применять оптимизации и семантические преобразования, такие как превращение вашего FROM/WHERE в JOIN. Его также делает явным неявный код и значения по умолчанию (например, ALGORITHM = UNDEFINED).

Удовлетворение результатов поездки туда и обратно может помочь вам обнаружить тонкие ошибки в вашем коде, особенно о порядке операций. Иногда декомпилятор может попросить добавить дополнительные круглые скобки, чтобы сделать порядок очевидным.

В MySQL нет смысла хранить исходные CREATE для таблиц и представлений, они становятся бесполезными, если используется ALTER. Однако возвращение ваших запросов, как изначально написанных, возможно.

+0

Я не понял, что он также удаляет комментарии. Для меня это большая проблема, потому что мне нужно добавить документацию. Вы знаете, как настроить mysql для хранения исходного кода? – quimmo

+0

@quimmo Я сомневаюсь, что это возможно. Что он сделал бы с таблицей, которая была изменена? Именно по этой причине вы не должны использовать базу данных в качестве своего канонического источника информации о схеме. Раньше было хуже, MySQL использовал, чтобы не хранить информацию о внешнем ключе (он имел синтаксис, но ничего не делал с ним). Ваша схема должна быть в репозитории кода. – Schwern

+0

Вы правы, единственный способ получить доступ к исходному коду - это прочитать файл .frm. Вот ответ: [ссылка] (https://books.google.com.mx/books?id=D0b_Xg3UeXEC&pg=PT516&lpg=PT516&dq=mysql+original+view&source=bl&ots=R_Nh1XEySF&sig=R9fKlRea91nBPTLOiaW1Xe2pLN0&hl=es&sa=X&ei=NC_mVNzUNJCryQSvs4CgBw&ved=0CGUQ6AEwCQ # v = onepage & q = mysql% 20original% 20view & f = false) – quimmo

Смежные вопросы