我创建表:

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


当compli 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`)))

最佳答案

您看到的是由SQL编译然后反编译导致的问题。

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


不用担心,它们都是等效的代码。如果您想要一个示例,请手动编写一些JSON,通过JSON解析器运行它,然后将数据转换回JSON。它看起来和原始的不一样。

这是转换数据的普遍问题,称为“往返”。如果不进行额外的工作,则会丢失非语义信息,例如注释,缩进和括号(或缺少括号)。 MySQL可能还会应用优化和语义转换,例如将FROM / WHERE变成JOIN。它还使隐式代码和默认值(例如ALGORITHM = UNDEFINED)显式化。

查看往返的结果可以帮助您发现代码中的细微错误,尤其是有关操作顺序的错误。有时可能会要求反编译器添加额外的括号以使顺序显而易见。

MySQL没有必要为表和视图存储原始的CREATE,如果使用ALTER,它们将变得无用。但是,可以返回原始编写的查询。

关于mysql - 为什么mysql更改我的代码 View ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28612175/

10-10 11:13
查看更多