为什么mysql改变我的代码视图?

时间:2015-02-19 16:53:36

标签: 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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

这是转换称为“往返”的数据的常见问题。没有额外的工作,就会丢失评论,缩进和括号(或缺少它们)等非语义信息。 MySQL也可以应用优化和语义转换,例如将FROM / WHERE转换为JOIN。它还使隐式代码和默认值(例如ALGORITHM = UNDEFINED)显式。

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

MySQL存储表格和视图的原始CREATE没有意义,如果使用ALTER,它们就变得无用了。但是,可以按原始方式返回查询。