在 Mycat + MySQL 分庫分表架構中,使用 Navicat 連接 Mycat (預設埠 8066) 執行從 mysqldump 匯出的 INSERT 語句時,全域表插入正常,但分片表報錯:
[Err] 1064 - partition table, insert must provide ColumnList
INSERT INTO `t_rank` VALUES ('259bfdc3-7922-4839-96c7-61c89e877dc5', '法國', '7', '11', '11', '12', null, '34');
INSERT INTO `t_rank` VALUES ('41eece5d-9d86-4cfe-b0ce-e6d4e4021cac', '中國', '2', '38', '27', '23', null, '88');
INSERT INTO `t_user_label` VALUES ('00041fc4-5947-11e6-a45d-fa163ee05659', '1ae56f42-dd56-4c00-9cf7-c580f428e20d', '0', null, '工作', '13', null, '1470207308693', '1470207308693', null, null, null, null);
錯誤訊息明確要求:「分區表插入必須提供 ColumnList (欄位列表)」。
在 INSERT 語句中顯式指定所有欄位名稱:
INSERT INTO t_user_setting(
ACCOUNT_ID, ACCOUNT_NAME, CTAG, ACCOUNT_TYPE, ACCOUNT_STATUS,
REGIST_CHANNEL, REGIST_TIME, ACTIVE_CHANNEL, ACTIVE_TIME,
CALENDAR_VIEW, WEEK_FORMAT, REPEAT_VIEW, USER_LABEL_NAME,
USER_LABEL_COLOR, PROVINCE, MEAL, IS_NEED_REMIND, REMIND_TYPE,
REMIND_TIME_AHEAD, CREATE_TIME, LAST_UPDATE_TIME, LAST_LOGIN_TIME
) VALUES (
'0006f1b5-956d-4b2d-a3d7-baa10174b841', '13062545830@189.cn', '0', '0', '2',
null, '1469936755211000', null, null, '1', '0', '1',
'13062545830@189.cn', '9', null, null, '1', '{"sms":0,"email":1}',
'600000', '1469936755211000', '1469936755211', null
);

user_id、tenant_id)。若不指定欄位,解析器無法確認 VALUES 順序對應的欄位,無法提取分片鍵值。INSERT INTO table VALUES(...) 依賴建表時的欄位順序。分片表可能經歷 DDL 變更 (增/減/調整欄位),導致備份腳本與目標表結構不一致。強制指定欄位可確保語義明確。--complete-insert 參數,自動產生帶欄位列表的 INSERT:mysqldump --complete-insert -u root -p db_name > dump.sqlMycat 分片表強制要求 INSERT 指定欄位列表,是為了確保分片路由計算的準確性與 SQL 語義的明確性。這不是 Bug,而是分布式資料庫中介軟體的設計約束。養成「永遠寫欄位列表」的習慣,能避免 90% 的遷移與相容性問題。