開發測試階段頻繁需要「表數據遷移/備份/構造測試集」。MySQL 支持 INSERT INTO SELECT,但不支持標準 SQL 的 SELECT INTO TABLE(會報 1327 Undeclared variable)。本文對比兩者語法、適用場景,並給出 MySQL 專用替代方案。
-- 指定列映射,支持常量、表達式、函數
INSERT INTO `target_table` (`col1`, `col2`, `col3`, `static_col`)
SELECT `src_col1`, `src_col2`, UPPER(`src_col3`), 'v2.0'
FROM `source_table`
WHERE `status` = 1;
IGNORE/ON DUPLICATE KEY UPDATE 處理衝突標準語法:SELECT col1, col2 INTO new_table FROM src_table;
MySQL 執行報錯:ERROR 1327 (42000): Undeclared variable: new_table
-- 一條語句:建表 + 複製數據 + 推導列類型
CREATE TABLE `new_table`
SELECT `id`, `name`, `email`
FROM `source_table`
WHERE `active` = 1;
CREATE TABLE `new_table` LIKE `source_table`;INSERT INTO `new_table` SELECT * FROM `source_table`;INSERT ... SELECT ... WHERE id BETWEEN ? AND ?,避免長事務、主從延遲。CHECKSUM TABLE source_table, new_table; 對比行數與校驗和。-- 同實例跨庫
INSERT INTO `db2`.`target` SELECT * FROM `db1`.`source`;
-- 不同實例:mysqldump + 管道導入(推薦)
mysqldump -h src_host -u user -p db1 source_table | mysql -h dst_host -u user -p db2
記住:MySQL 做表級複製,CREATE TABLE LIKE + INSERT SELECT 是通用標準動作;CREATE TABLE SELECT 僅作臨時探查用。