我创建表格:
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`)))
答案 0 :(得分:1)
您所看到的是由于SQL被编译然后反编译而导致的问题。
human readable SQL -> compiled form -> human readable SQL
别担心,这都是等效的代码。如果您想要一个示例,请手动编写一些JSON,通过JSON解析器运行它,然后将该数据转换回JSON。它与原始版本看起来不一样。
这是转换称为“往返”的数据的常见问题。没有额外的工作,就会丢失评论,缩进和括号(或缺少它们)等非语义信息。 MySQL也可以应用优化和语义转换,例如将FROM / WHERE转换为JOIN。它还使隐式代码和默认值(例如ALGORITHM = UNDEFINED
)显式。
查看往返结果可以帮助您发现代码中的细微错误,尤其是有关操作顺序的错误。有时可以要求反编译器添加额外的括号以使命令明显。
MySQL存储表格和视图的原始CREATE没有意义,如果使用ALTER,它们就变得无用了。但是,可以按原始方式返回查询。