在資料庫開發中,經常遇到需要根據另一張表的數據來更新當前表的場景。假設有兩張表:
a(id, sex, email, public)b(id, depart, salary)因業務變更,需為表 b 新增 public 欄位,並使其值與表 a 中相同 id 記錄的 public 值保持一致。
許多開發者習慣寫法如下:
UPDATE b SET public = a.public FROM a WHERE b.id = a.id
但在 MySQL 執行時會報錯。原因在於 MySQL 不支援 UPDATE 語句中的 FROM 子句,上述寫法適用於 SQL Server、PostgreSQL 等資料庫。
MySQL 支援在 UPDATE 中直接列出多張表,並透過 WHERE 條件關聯:
UPDATE b, a SET b.public = a.public WHERE b.id = a.id
或使用 INNER JOIN 語法(更符合 ANSI SQL 標準,可讀性更強):
UPDATE b
INNER JOIN a ON b.id = a.id
SET b.public = a.public;
id 欄位有索引,否則大數據量下會全表掃描,效能極差。b 表尚未建立 public 欄位,需先 ALTER TABLE b ADD COLUMN public VARCHAR(255);(型別依實際情況調整)。SELECT 驗證關聯結果:SELECT b.id, a.public FROM b INNER JOIN a ON b.id = a.id;MySQL 表間更新的核心在於「多表列在 UPDATE 後,用 WHERE 或 JOIN 關聯」。記住這一點,即可避開 FROM 子句陷阱,高效完成跨表數據同步。