ERROR 1046: No database selected 是因会话未选择数据库,需在 CREATE VIEW 前执行 USE your_database_name; 或在 SQL 中显式指定数据库名,否则 MySQL 拒绝执行。
没选库就执行 CREATE VIEW,MySQL 直接拒绝,不给你任何商量余地。
这不是权限或语法问题,就是会话当前没绑定数据库。常见于命令行直连后忘了 USE db_name;,或者脚本里 CREATE VIEW 在 USE 之前执行。
SELECT DATABASE(); 确认当前库是否为空CREATE VIEW 前加一行 USE your_database_name;
mysqldump --databases db_name 而不是 --all-databases,避免漏掉 USE 语句视图定义里写的表名,目标库真没有——要么根本没导入,要么大小写对不上(Linux 下敏感),要么是分区表/临时表这种不能被视图引用的对象。
MySQL 创建视图时会立刻检查底表是否存在,不等你查就报错。
SHOW TABLES LIKE 'xxx';,确认表存在且名称完全一致(包括下划线、大小写)`user_info`,避免关键字冲突TEMPORARY TABLE)不能出现在视图定义中开发库导出的视图带 DEFINER = 'dev'@'localhost',但生产库没这个用户,MySQL 拒绝创建。
这不是权限不够,是用户根本不存在——哪怕你用 root 登录也没用。
DEFINER = '.*?'@'.*?' 为 DEFINER = CURRENT_USER
DEFINER = ...,MySQL 会自动设为当前登录用户mysqldump --user=root 导出再往无 root 权限环境导,容易把本地 Definer 带过去错误信息看着像缺 WITH SCHEMABINDING,其实真正卡住的是会话级 SET 选项——ANSI_NULLS、QUOTED_IDENTIFIER、ARITHABORT 必须全为 ON。
SSMS 图形界面保存视图时默认关掉 ANSI_NULLS,后续建索引就跪了。
SET ANSI_NULLS ON; SET QUOTED_IDENTIFIER ON; SET ARITHABORT ON;
CREATE VIEW 在同一语句批中,中间不能有 GO
WITH SCHEMABINDING,且不能含 GETDATE()、NEWID() 这类非确定性逻辑