萬盛學電腦網

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

MySQL 與 SQL Server SELECT INTO 差異解析:替代方案與最佳實踐

核心差異

特性MySQLSQL Server
SELECT * INTO new_tbl FROM old_tbl ❌ 不支援(語法錯誤) ✅ 建立新表並複製結構+資料
SELECT ... INTO OUTFILE ✅ 導出資料到文件 ❌ 不支援(用 BCP/SSIS)
CREATE TABLE ... SELECT ✅ 建表+複製資料(無索引/約束) ✅ 同樣支援

MySQL 複製表結構與資料的標準方法

1. 完整複製(結構+資料+索引)

CREATE TABLE new_table LIKE old_table;
INSERT INTO new_table SELECT * FROM old_table;

2. 僅複製結構

CREATE TABLE new_table LIKE old_table;
-- 或
CREATE TABLE new_table AS SELECT * FROM old_table WHERE 1=0;

3. 複製結構+資料(無索引/外鍵/自增)

CREATE TABLE new_table AS SELECT * FROM old_table;
-- 等同於
CREATE TABLE new_table (SELECT * FROM old_table);

⚠ 注意:不會複製主鍵、索引、外鍵、AUTO_INCREMENT、觸發器。

mysqldump 遷移大表/跨實例

# 導出結構+資料
mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 db_name old_table > table.sql

# 修改表名(sed 或編輯器)
sed -i 's/`old_table`/`new_table`/g' table.sql

# 導入
mysql -u root -p db_name < table.sql

SELECT INTO OUTFILE 導出文件

基本語法

SELECT * 
INTO OUTFILE '/tmp/export.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM my_table
WHERE created_at > '2024-01-01';

權限要求

  • 需 FILE 權限:GRANT FILE ON *.* TO 'user'@'host';
  • 目標目錄需 MySQL 進程寫入權限(通常 secure_file_priv 限制)
  • 檢查:SHOW VARIABLES LIKE 'secure_file_priv';

Windows 路徑寫法

SELECT * INTO OUTFILE 'C:/exports/data.csv' ...  -- 正斜線或雙反斜線
-- 錯誤寫法:'C:\exports\data.csv' (\e 被轉義)

Linux 環境實戰

# 導出慢查詢分析
SELECT * INTO OUTFILE '/var/lib/mysql-files/slow_queries.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10000;

對比總結:何時用什麼

需求推薦方法優點缺點
同庫複製表(含索引) CREATE TABLE ... LIKE + INSERT 保留完整結構 兩步驟
同庫複製表(僅結構+資料) CREATE TABLE ... AS SELECT 單條語句 丟失索引/約束/自增
跨庫/跨實例遷移 mysqldump + sed 改名 完整結構、壓縮傳輸 需磁盤空間、較慢
導出 CSV/文本供外部系統 SELECT INTO OUTFILE Server 端直寫、高效能 需 FILE 權限、路徑限制
應用層導出 程式碼查詢 + CSV 庫 靈活、無權限限制 網路傳輸、記憶體壓力

遷移檢核清單

  • [ ] 確認目標表不存在或已備份
  • [ ] 使用 CREATE TABLE ... LIKE 保留索引/約束
  • [ ] 大表分批 INSERT ... SELECT ... LIMIT 10000 OFFSET ...
  • [ ] 驗證行數:SELECT COUNT(*) FROM old_table; SELECT COUNT(*) FROM new_table;
  • [ ] 檢查自增值:SHOW TABLE STATUS LIKE 'new_table';
  • [ ] 重建外鍵(如有)

總結

MySQL 不支援 SELECT INTO table,標準替代方案是 CREATE TABLE new_table LIKE old_table; INSERT INTO new_table SELECT * FROM old_table;。導出文件用 SELECT INTO OUTFILE,注意 secure_file_priv 限制。跨實例遷移首選 mysqldump。理解差異、選對工具、驗證數據,是資料庫操作的基本功。

copyright © 萬盛學電腦網 all rights reserved