Mysql
如何將所有條目插入映射表
我有一個地圖表
CREATE TABLE keymap ( col1 int(11) unsigned NOT NULL, col2 int(11) unsigned NOT NULL, col3 int(11) unsigned NOT NULL, FOREIGN KEY(col1) REFERENCES table1(col1) ON DELETE CASCADE, FOREIGN KEY(col2) REFERENCES table2(col2) ON DELETE CASCADE, FOREIGN KEY(col3) REFERENCES table3(col3) ON DELETE CASCADE, PRIMARY KEY (col1,col2,col3) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci
,和
INSERT
的所有可能組合的最有效方法是什麼?col1``col2``col3
我問這個簡單問題的原因是表格很大(數千萬行),我需要
INSERT
定期填充缺失的組合(table1、table2 和 table3 定期被放大)。
方法#1
如果您從不從
table1
、table2
或table3
第1步
使用笛卡爾連接,生成一個進行單獨插入的腳本
SQL="SELECT CONCAT('INSERT IGNORE INTO keymap VALUES" SQL="${SQL} (',col1,',',col2,',',col3,');') FROM" SQL="${SQL} (SELECT col1 FROM table1) A," SQL="${SQL} (SELECT col2 FROM table2) B," SQL="${SQL} (SELECT col3 FROM table3) C;" read -s pw ; echo ${pw} | less DB=mydb echo "SET foreign_key_checks = 0;" > All_Key_Combinations.sql mysql -uroot -p${pw} -D${DB} -ANe"${SQL}" >> All_Key_Combinations.sql
第2步
檢查腳本並確保它沒問題
head All_Key_Combinations.sql echo tail All_Key_Combinations.sql echo sleep 15 less All_Key_Combinations.sql
第 3 步
執行 All_Key_Combinations.sql
DB=mydb mysql -uroot -p${pw} -D${DB} < All_Key_Combinations.sql
方法#2
如果您曾經從
table1
、table2
或table3
第1步
使用笛卡爾連接,生成一個進行單獨插入的腳本
SQL="SELECT CONCAT('INSERT INTO keymap VALUES" SQL="${SQL} (',col1,',',col2,',',col3,');') FROM" SQL="${SQL} (SELECT col1 FROM table1) A," SQL="${SQL} (SELECT col2 FROM table2) B," SQL="${SQL} (SELECT col3 FROM table3) C;" read -s pw ; echo ${pw} | less DB=mydb echo "SET foreign_key_checks = 0;" > All_Key_Combinations.sql echo "TRUNCATE TABLE keymap;" >> All_Key_Combinations.sql mysql -uroot -p${pw} -D${DB} -ANe"${SQL}" >> All_Key_Combinations.sql
第2步
檢查腳本並確保它沒問題
head All_Key_Combinations.sql echo tail All_Key_Combinations.sql echo sleep 15 less All_Key_Combinations.sql
第 3 步
執行 All_Key_Combinations.sql
DB=mydb mysql -uroot -p${pw} -D${DB} < All_Key_Combinations.sql
試試看 !!!