String sql = "INSERT INTO userInfo(NAME, EMPCODE, ...) VALUES (?,?,...) WHERE userId=?";
報錯:You have an error in your SQL syntax ... near 'WHERE userId=1434594273200'
標準 SQL INSERT 語法不支援 WHERE 子句。INSERT 用於新增行,目標行不存在,無法按條件定位。
-- MySQL
INSERT INTO userInfo (userId, NAME, EMPCODE, ...)
VALUES (?, ?, ?, ...)
ON DUPLICATE KEY UPDATE
NAME=VALUES(NAME), EMPCODE=VALUES(EMPCODE), ...;
-- SQL Server
MERGE INTO userInfo AS target
USING (VALUES (?, ?, ?, ...)) AS source (userId, NAME, EMPCODE, ...)
ON target.userId = source.userId
WHEN MATCHED THEN UPDATE SET NAME=source.NAME, EMPCODE=source.EMPCODE, ...
WHEN NOT MATCHED THEN INSERT (userId, NAME, EMPCODE, ...) VALUES (source.userId, source.NAME, source.EMPCODE, ...);
-- PostgreSQL
INSERT INTO userInfo (userId, NAME, EMPCODE, ...)
VALUES (?, ?, ?, ...)
ON CONFLICT (userId) DO UPDATE SET NAME=EXCLUDED.NAME, EMPCODE=EXCLUDED.EMPCODE, ...;
前提:userId 為主鍵或唯一索引。
UPDATE userInfo
SET NAME=?, EMPCODE=?, DEPTCODE=?, ...
WHERE userId=?;
-- MySQL
INSERT INTO userInfo (userId, NAME, ...)
SELECT ?, ?, ... FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM userInfo WHERE userId=?);
-- SQL Server
IF NOT EXISTS (SELECT 1 FROM userInfo WHERE userId=?)
INSERT INTO userInfo (userId, NAME, ...) VALUES (?, ?, ...);
// 使用 UPDATE
String sql = "UPDATE userInfo SET NAME=?, EMPCODE=?, DEPTCODE=?, SEX=?, TEL=?, MOBILE=?, STATE=?, USERTYPE=?, ADDRESS=?, POSTALCODE=?, STATION=?, QQ=? WHERE userId=?";
try (PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, name);
// ... set other params
ps.setLong(13, userId);
ps.executeUpdate();
}
? 對應 setX 方法。| 意圖 | 錯誤寫法 | 正確寫法 |
|---|---|---|
| 有則改無則增 | INSERT ... WHERE | ON DUPLICATE KEY UPDATE / MERGE |
| 只改已有 | INSERT ... WHERE | UPDATE ... WHERE |
| 無則增 | INSERT ... WHERE NOT EXISTS | INSERT ... SELECT ... WHERE NOT EXISTS |
SQL 語法嚴格區分 DML 操作類型,掌握各資料庫的合併寫法,避免在應用層邏輯判斷後分發兩條語句(易產生競態條件)。