// 錯誤 1: UPDATE 後跟 FROM (MySQL 不支持)
sqls.add("update from user set loginName='...' where loginName='...'");
// 錯誤 2: 多表更新語法錯誤
sqls.add("update from userinfo set loginName='...', gender='...' where loginName='...'");
報錯:You have an error in your SQL syntax near 'from userinfo...'
-- 單表更新
UPDATE table_name
SET col1 = val1, col2 = val2
WHERE condition;
-- 多表更新 (關聯更新)
UPDATE table1 t1
JOIN table2 t2 ON t1.id = t2.id
SET t1.col = val1, t2.col = val2
WHERE t1.condition;
// 單表 user 更新
String sql1 = "UPDATE user " +
"SET loginName = ?, userName = ? " +
"WHERE loginName = ?";
// 多表關聯更新 (若 user 和 userinfo 通過 loginName 關聯)
String sql2 = "UPDATE user u " +
"JOIN userinfo ui ON u.loginName = ui.loginName " +
"SET u.loginName = ?, u.userName = ?, " +
" ui.loginName = ?, ui.gender = ?, ui.birthday = ?, " +
" ui.address = ?, ui.mobile = ?, ui.tel = ?, ui.email = ?, " +
" ui.quanpin = ?, ui.jianpin = ? " +
"WHERE u.loginName = ?";
try (PreparedStatement ps = conn.prepareStatement(sql2)) {
ps.setString(1, uloginName); // u.loginName
ps.setString(2, userName); // u.userName
ps.setString(3, uloginName); // ui.loginName
ps.setString(4, gender);
ps.setString(5, birthday);
ps.setString(6, address);
ps.setString(7, mobile);
ps.setString(8, tel);
ps.setString(9, email);
ps.setString(10, CHNUtil.getFullSpell(userName));
ps.setString(11, CHNUtil.getFirstSpell(userName));
ps.setString(12, loginName); // WHERE u.loginName
ps.executeUpdate();
}
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
UPDATE FROM table SET ... | MySQL 無 FROM 子句 | UPDATE table SET ... |
UPDATE t1, t2 SET ... WHERE ... | 舊式隱式連接,易出錯 | UPDATE t1 JOIN t2 ON ... SET ... |
| 字符串拼接 SQL | 注入風險、轉義麻煩 | PreparedStatement 參數化 |
| WHERE 條件用舊值 | 若 loginName 被更新,WHERE 失效 | WHERE 用主鍵或舊值變量 |
conn.setAutoCommit(false);
try {
ps1.executeUpdate(); // user
ps2.executeUpdate(); // userinfo
conn.commit();
} catch (SQLException e) {
conn.rollback();
throw e;
} finally {
conn.setAutoCommit(true);
}
MySQL UPDATE **不寫 FROM**,單表直接 UPDATE table SET ...,多表用 JOIN。**務必使用 PreparedStatement 參數化**,並用事務保證多表更新原子性。