USE 語法
USE db_name;
-- 將 db_name 設為當前 Session 的預設資料庫
-- 後續無前綴的表名將解析為 db_name.表名
互動模式範例
mysql> USE shili;
Database changed
mysql> SELECT * FROM shili_user;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | 明日科技 | 123456 |
+----+----------+----------+
跨資料庫查詢 (無需 USE 切換)
-- 完整限定名:database.table
SELECT * FROM shili.shili_user;
-- 連接多庫表
SELECT u.username, o.order_no
FROM shop.users u
JOIN orders.orders o ON u.id = o.user_id
WHERE u.status = 1;
連線池與應用層最佳實踐
| 場景 | 建議 | 範例 |
| 單一應用對單一資料庫 | 連線字串指定 Database,無需 USE | jdbc:mysql://host:3306/shop?useSSL=false |
| 單一應用對多資料庫 | 建立多個 DataSource,各自指定 Database | Spring: @Primary DataSource shopDs + DataSource ordersDs |
| 共用連線池需動態切庫 | 極不推薦;若必須,執行 USE db 後立即執行業務 SQL,同一事務內 | 事務邊界內保證一致性 |
| 多租戶 (Schema 隔離) | 連線建立後執行 USE tenant_${id},或使用 SET SESSION schema = ... (8.0+) | 中介軟體攔截器自動切換 |
驗證當前資料庫
SELECT DATABASE(); -- 回傳當前預設庫,若無則 NULL
SHOW TABLES; -- 列出當前庫所有表
避坑指南
- ❌ 連線字串未指定 Database,應用啟動後首個查詢報
No database selected。
- ❌ 事務中途
USE other_db → 隱式提交當前事務 (DDL/USE 導致隱式提交)。
- ❌ 預存程序/觸發器/事件定義體內使用
USE → 編譯錯誤或運行時錯誤。
- ✅ 連線建立時即指定目標 Database,避免運行時切換。
- ✅ 跨庫查詢使用完整限定名
db.table,清晰可追溯。
USE 是 Session 級狀態,非全域。連線池複用連線時,前一請求的 USE 狀態會殘留到下一請求,極易導致「查錯庫」生產事故。鐵律:連線字串顯式指定 Database,應用層杜絕動態 USE。