SELECT
返回結構
const [rows, fields] = await db.query('SELECT * FROM folders');
返回:
rows
: 是一個數組,包含所有查到的記錄。fields
: 是字段的結構定義(列信息),一般不用。
rows
是一個數組,包含所有查到的記錄:
[{ id: 1, name: '一級選項1', parent_id: null },{ id: 2, name: '子目錄1', parent_id: 1 }
]
INSERT
返回結構
const [result] = await db.query('INSERT INTO folders (name, parent_id) VALUES (?, ?)', ['test', 1]);
result
是一個包含插入信息的對象:
{fieldCount: 0, // 字段數(一般是 0,插入不返回字段)affectedRows: 1, // 受影響的行數insertId: 17, // 新插入的主鍵 IDserverStatus: 2, // MySQL 服務器狀態碼warningCount: 0, // 警告數量,0 表示無警告message: '', // 服務器返回的信息,一般為空或插入成功消息protocol41: true, // 與協議有關,true 表示使用 4.1 協議changedRows: 0 // 插入時恒為 0,僅在 UPDATE 時有意義
}
所以判斷成功的辦法是通過 affectedRows
:
if (result.affectedRows === 1) {return res.status(200).json({message: '目錄添加成功',folderId: result.insertId});
} else {return res.status(500).json({ error: '添加目錄失敗' });
}
UPDATE
返回結構:
const [result] = await db.query('UPDATE folders SET name = ? WHERE id = ?', ['newName', 17]);
result
內容:
{fieldCount: 0,affectedRows: 1, // 匹配并執行更新的行數(包括實際沒變內容的)insertId: 0, // 無插入則為 0serverStatus: 2,warningCount: 0,message: '(Rows matched: 1 Changed: 1 Warnings: 0)',protocol41: true,changedRows: 1 // 實際內容發生變化的行數
}
DELETE
返回結構:
const [result] = await db.query('DELETE FROM folders WHERE id = ?', [17]);
result
內容:
{fieldCount: 0,affectedRows: 1, // 刪除成功的行數insertId: 0,serverStatus: 2,warningCount: 0,message: '', // 有時會包含刪除說明protocol41: true,changedRows: 0 // 始終為 0,DELETE 不用這個字段
}
不能隨便“模擬”結構解構,必須清楚它的真實結構是數組 [rows, fields]
,否則會出錯。
? 錯誤示例:
const { affectedRows } = await db.query(...); // ? 報錯,因為它不是對象,是數組
? 正確示例:
const [result] = await db.query(...); // result 是對象
console.log(result.affectedRows); // 訪問插入/更新結果
總結
場景 | 返回值結構 | 解構方式 |
---|---|---|
SELECT | [rows, fields] | [rows] 或 [rows, fields] |
INSERT/UPDATE/DELETE | [result, undefined] | [result] |
由于
- 新增
result.affectedRows === 1
; - 編輯
result.affectedRows > 0
更新語句執行了,result.changedRows > 0
內容確實有變更; - 刪除
result.affectedRows > 0
;
新增
const [result] = await db.query('INSERT INTO folders (name) VALUES (?)', ['Test']);if (result.affectedRows === 1) {console.log('插入成功,ID:', result.insertId);
} else {console.log('插入失敗');
}
編輯
const [result] = await db.query('UPDATE folders SET name = ? WHERE id = ?', ['NewName', 5]);if (result.affectedRows > 0) {console.log('更新語句執行了');if (result.changedRows > 0) {console.log('內容確實有變更');} else {console.log('字段值沒變(例如改成原來的值)');}
} else {console.log('沒有任何記錄被更新');
}
刪除
const [result] = await db.query('DELETE FROM folders WHERE id = ?', [999]);if (result.affectedRows > 0) {console.log('刪除成功');
} else {console.log('未刪除任何記錄(可能 id 不存在)');
}
最實用的判斷邏輯:
try {const [result] = await db.query(sql, values);if (result.affectedRows > 0) {// ? SQL 生效} else {// ?? SQL 沒生效(可能條件不匹配)}
} catch (err) {// ? SQL 執行失敗(語法、連接、權限等錯誤)
}