当我在 MySql 中执行 mysqldump 时,视图没有被正确转储。
当我这样做时:
mysqldump --opt --user=root --routines --max_allowed_packet=1024M my_database > my_file.sql
我在 my_file.sql 中得到这个:
CREATE VIEW my_view AS
SELECT
1 AS id,
1 AS full_name
在我的 MySql 服务器中,原始创建视图语句如下所示:
CREATE VIEW my_view AS
SELECT
t1.id AS id,
CONCAT(t2.name,' ',t1.name) AS full_name
FROM t1
LEFT JOIN t2 ON t1.t2_id = t2.id
ORDER BY
t1.name,
t2.name
我已经尝试了 mysqldump 的所有 differenet 选项,但是没有任何东西可以使它在转储的 sql 文件中正确地创建视图。
这是正常的 mysqldump 行为。带有
1 AS <column>
的视图是临时视图。转储输出中的真实视图较低。
演示:我在我的测试模式中创建了一个表
t
和一个视图v
:
mysql> use test
mysql> create table t ( id int primary key );
mysql> create view v as select * from t;
然后我转储测试模式并检查输出。对于这个例子,我省略了一堆 mysqldump 输出。
-- MySQL dump 10.13 Distrib 8.0.32, for macos13 (arm64)
--
-- Table structure for table `t`
--
DROP TABLE IF EXISTS `t`;
CREATE TABLE `t` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
--
-- Temporary view structure for view `v`
--
DROP TABLE IF EXISTS `v`;
/*!50001 DROP VIEW IF EXISTS `v`*/;
/*!50001 CREATE VIEW `v` AS SELECT
1 AS `id`*/;
--
-- Final view structure for view `v`
--
/*!50001 DROP VIEW IF EXISTS `v`*/;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
/*!50001 VIEW `v` AS select `t`.`id` AS `id` from `t` */;
-- Dump completed on 2023-03-28 9:12:32
可以看到评论先是临时视图,然后是真实视图。