萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL USE 指令切換資料庫與跨庫查詢實戰

MySQL 中 USE 指令用於設定當前預設資料庫(Current Database),後續未指定資料庫前綴的表操作將針對該資料庫。本文詳細說明 USE 用法、跨庫查詢語法、會話層級生效範圍與實務應用場景。

一、基本語法與操作流程

-- 1. 查看所有資料庫
SHOW DATABASES;

-- 2. 切換到目標資料庫
USE test_db;
-- Database changed

-- 3. 後續操作預設針對 test_db
SHOW TABLES;           -- 查看 test_db 下的表
SELECT * FROM users;   -- 等同 SELECT * FROM test_db.users

二、跨資料庫查詢(不切換 USE)

使用 資料庫名.表名 完整限定名稱,可在同一會話中同時存取多個資料庫:

-- 當前 USE db1
USE db1;

-- 直接查詢 db2 的表
SELECT * FROM db2.users WHERE id = 1;

-- 跨庫 JOIN
SELECT a.name, b.order_no
FROM db1.users a
JOIN db2.orders b ON a.id = b.user_id;

優勢: 不需頻繁切換 USE,適合多庫聯查、ETL、報表場景。

三、USE 生效範圍與權限

  • 會話級別: USE 只對當前連線有效,斷線重連需重新 USE。
  • 權限檢查: 執行 USE 時需有該資料庫的任意權限(如 SELECT、USAGE),否則報錯 ERROR 1044 (42000): Access denied。
  • 不影響其他連線: 每個連線獨立維護當前資料庫。

四、實務應用場景

1. 腳本/存儲程序中動態切換

DELIMITER //
CREATE PROCEDURE sync_data()
BEGIN
  USE source_db;
  INSERT INTO target_db.logs SELECT * FROM events WHERE created_at > DATE_SUB(NOW(), INTERVAL 1 DAY);
  USE target_db;
  DELETE FROM logs WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
END//
DELIMITER ;

2. 多租戶架構:每租戶一庫

-- 應用層根據租戶 ID 動態 USE
USE tenant_1001_db;
SELECT * FROM orders WHERE ...

3. 備份/遷移腳本

#!/bin/bash
# 備份所有資料庫結構
for db in $(mysql -e "SHOW DATABASES" -s --skip-column-names); do
  mysqldump --no-data $db > ${db}_schema.sql
done

五、常見問題

Q: USE 後 SHOW TABLES 為空?
A: 確認資料庫確實有表,或權限問題(需 SELECT 權限)。
Q: 能否在交易中 USE 切換資料庫?
A: 可以,但跨庫交易需注意:MySQL 不支援跨庫 XA 交易(除非用 XA TRANSACTION),單庫交易內 USE 切換不影響當前交易。
Q: 預設資料庫如何設定?
A: 連線字串指定 Database=dbname,或配置檔 [client] database=dbname,啟動時自動 USE。

六、總結

USE 是會話級資料庫上下文切換指令,簡單但關鍵。實務上推薦使用完整限定名稱(`db.table`)進行跨庫查詢,減少 USE 切換帶來的上下文混淆與權限問題。結合權限控制、連線池預設資料庫設定,可構建清晰、安全的多資料庫存取架構。

copyright © 萬盛學電腦網 all rights reserved