開發時習慣在 Navicat 查詢結果格直接雙擊修改資料。某天發現某單表查詢結果整張表格灰色不可編輯,工具列「編輯」圖標也置灰。直覺以為是權限或鎖表,檢查後發現:該表根本沒有定義主鍵。
Navicat(以及多數 GUI 工具)的「可編輯結果集」功能,依賴 主鍵或唯一非空索引 來唯一識別每一行,以便產生精準的 UPDATE ... WHERE pk = ? 語句。若表無主鍵,工具無法保證更新語句只影響目標行,為防誤更新整表,預設鎖定為唯讀。
ALTER TABLE `your_table` ADD COLUMN `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;
或指定現有業務唯一欄位:ALTER TABLE `t` ADD PRIMARY KEY (`biz_id`);
ALTER TABLE `your_table` ADD UNIQUE INDEX `uk_biz` (`biz_col`);
前提是該欄位已 NOT NULL 且現有資料無重複。
ROW_NUMBER() 偽主鍵(8.0+):
SELECT *, ROW_NUMBER() OVER () AS _navicat_pk FROM `your_table`;
但此結果集通常仍不可編輯,因非基表欄位。BIGINT UNSIGNED AUTO_INCREMENT)。五分鐘加上主鍵,省去數小時排查「為什麼不能編輯」的時間。資料庫設計第一課:沒有主鍵的表不是關係表。