備份與刪除操作需針對 21 個固定 aa 值,多張表(A/B/C/D/E...)重複出現相同的超長 IN (...) 列表,維護極其困難:
-- 重複 5+ 次的硬編碼列表
WHERE aa IN ('eimdmc','30mdnci','cienc03',...,'300993983d')
-- 1. 創建參數表(永久或臨時)
CREATE TABLE filter_values (val VARCHAR(50) PRIMARY KEY);
INSERT INTO filter_values VALUES
('eimdmc'),('30mdnci'),('cienc03'),...,('300993983d');
-- 2. 所有查詢統一引用
CREATE TABLE A_1 AS SELECT * FROM A WHERE aa IN (SELECT val FROM filter_values);
DELETE FROM A WHERE aa IN (SELECT val FROM filter_values);
-- B/C/D/E 同理
WITH params AS (
SELECT 'eimdmc' AS val UNION ALL
SELECT '30mdnci' UNION ALL
SELECT 'cienc03' UNION ALL ...
)
DELETE FROM A WHERE aa IN (SELECT val FROM params);
-- 概念示例
List ids = Arrays.asList("eimdmc", "30mdnci", ...);
String placeholders = ids.stream().map(i -> "?").collect(Collectors.joining(","));
String sql = "DELETE FROM A WHERE aa IN (" + placeholders + ")";
// PreparedStatement 批量設置參數
| 維度 | 硬編碼 IN | 參數表/子查詢 |
|---|---|---|
| 可維護性 | 極差(多處同步修改) | 優(單點維護) |
| 執行計劃 | 每次硬解析 | 可復用/參數化 |
| 安全性 | 注入風險 | 參數化防注入 |
| 擴展性 | 難以動態調整 | 輕鬆增減值 |
filter_values.val 建索引,子查詢轉為高效連接(JOIN)。aa 分區,配合分區裁剪。LIMIT 10000 循環刪除。「將數據從代碼中分離」是 SQL 工程化的第一步 —— 用表管理列表,讓 SQL 回歸純邏輯。