gpt4 book ai didi

mysql - 为什么mysql改变我的代码 View ?

转载 作者:行者123 更新时间:2023-11-29 12:24:02 24 4
gpt4 key购买 nike

我创建表:

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;

我创建一个 View :

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 也会更改 View ,添加不必要的括号。

原文:

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 存储表和 View 的原始 CREATE 是没有意义的,如果使用 ALTER,它们将变得毫无用处。但是,按照最初编写的方式返回您的查询是可能的。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com