我创建表:
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/