• Node.js Video Tutorials

Node.js - MySQL 更新



資料驅動的 Node.js 應用程式通常需要修改儲存在 MySQL 資料庫中的一條或多條記錄。這是透過將 UPDATE 查詢字串作為引數傳遞給 mysql.query() 方法來完成的。通常,現有記錄的資料需要更新,以使用者輸入的形式出現,例如 Node.js 基於 Web 的應用程式中釋出的 HTML 表單。在本章中,您將學習如何執行 MySQL UPDATE 查詢。從簡單的 UPDATE 開始,使用預處理語句和帶有 JOIN 的 UPDATE 將透過合適的 Node.js 示例進行演示。

簡單 UPDATE

MySQL 中基本 UPDATE 語句的語法如下:

UPDATE table_name 
SET 
   column_name1 = expr1, column_name2 = expr2,  ...
WHERE condition;

假設 MySQL 伺服器上有一個名為 mydb 的資料庫,並且 employee 表存在以下資料:

mysql> select * from employee;
+----+-------+------+--------+
| id | name  | age  | salary |
+----+-------+------+--------+
|  1 | Ravi  |   25 |  25000 |
|  2 | Anil  |   26 |  30000 |
|  3 | Meena |   26 |  27000 |
+----+-------+------+--------+

示例

以下程式更新 employee 表的 salary 欄位,將每個員工的工資增加 500 元

var mysql = require('mysql');
var con = mysql.createConnection({
   host: "localhost",
   user: "root",
   password: "mypassword",
   database: "mydb"
});

var qry ="UPDATE employee SET salary=salary+500;";
con.connect(function (err) {
   if (err) throw err;
   console.log("Connected!");
   con.query(qry, function(err) {
      if (err) throw err;
      console.log("Records updated successfully");
   });
});

執行以上程式碼後,轉到 MySQL 命令列客戶端並檢查 employee 表中的行:

mysql> select * from employee;
+----+-------+------+--------+
| id | name  | age  | salary |
+----+-------+------+--------+
|  1 | Ravi  |   25 |  25500 |
|  2 | Anil  |   26 |  30500 |
|  3 | Meena |   26 |  27500 |
+----+-------+------+--------+

您也可以在程式碼中新增如下迴圈以檢視員工記錄

qry =`SELECT name,salary FROM employee;`;
con.query(qry, function (err, results) {
   if (err) throw err;
   console.log(results);
});

輸出

[
  RowDataPacket { name: 'Ravi', salary: 25500 },
  RowDataPacket { name: 'Anil', salary: 30500 },
  RowDataPacket { name: 'Meena', salary: 27500 }
]

使用預處理語句進行 UPDATE

MySQL 支援預處理語句。您可以透過在查詢字串中嵌入的佔位符中插入可變資料來動態構建查詢。MySQL 使用 ? 符號作為佔位符。

var qry ="UPDATE employee SET salary=40000 WHERE name=?;";
var nm = "Anil";
con.connect(function (err) {
   if (err) throw err;
   console.log("Connected!");
   con.query(qry, nm, function(err) {
      if (err) throw err;
      console.log("Records updated successfully");
      var qry =`SELECT name,salary FROM employee WHERE name=?;`;
      con.query(qry,nm, function (err, results) {
         if (err) throw err;
         console.log(results);
      });
   });
});

這將把名為 Anil 的員工的工資更新為 40000 元

[ RowDataPacket { name: 'Anil', salary: 40000 } ]

UPDATE JOIN

JOIN 子句更常用於 SELECT 查詢中,以從兩個或多個相關表中檢索資料。您也可以在 UPDATE 查詢中包含 JOIN 子句,以執行跨表更新。

對於此示例,我們將建立兩個具有公共欄位的表,以在兩個表之間建立 PRIMARY KEY - FOREIGN KEY 關係。

merits 表

CREATE TABLE merits (
   performance INT(11) NOT NULL,
   percentage FLOAT NOT NULL,
   PRIMARY KEY (performance)
);

新增一些資料:

INSERT INTO merits(performance,percentage)
VALUES(1,0),
      (2,0.01),
      (3,0.03),
      (4,0.05),
      (5,0.08);
      (4,0.05),
      (5,0.08);

merits 表的內容:

mysql> select * from merits;
+-------------+------------+
| performance | percentage |
+-------------+------------+
|           1 |          0 |
|           2 |       0.01 |
|           3 |       0.03 |
|           4 |       0.05 |
|           5 |       0.08 |
+-------------+------------+

employees 表

CREATE TABLE employees (
   emp_id INT(11) NOT NULL AUTO_INCREMENT,
   emp_name VARCHAR(255) NOT NULL,
   performance INT(11) DEFAULT NULL,
   salary FLOAT DEFAULT NULL,
   PRIMARY KEY (emp_id),
   CONSTRAINT fk_performance FOREIGN KEY (performance)
      REFERENCES merits (performance)
);

在此表中,performance 是外部索引鍵,引用 merits 表中相同名稱的鍵。

新增一些資料:

INSERT INTO employees(emp_name,performance,salary)      
VALUES('Mary Doe', 1, 50000),
      ('Cindy Smith', 3, 65000),
      ('Sue Greenspan', 4, 75000),
      ('Grace Dell', 5, 125000),
      ('Nancy Johnson', 3, 85000),
      ('John Doe', 2, 45000),
      ('Lily Bush', 3, 55000);

employees 表的內容:

mysql> select * from employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name      | performance | salary |
+--------+---------------+-------------+--------+
|      1 | Mary Doe      |           1 |  50000 |
|      2 | Cindy Smith   |           3 |  65000 |
|      3 | Sue Greenspan |           4 |  75000 |
|      4 | Grace Dell    |           5 | 125000 |
|      5 | Nancy Johnson |           3 |  85000 |
|      6 | John Doe      |           2 |  45000 |
|      7 | Lily Bush     |           3 |  55000 |
+--------+---------------+-------------+--------+
7 rows in set (0.00 sec)

我們希望根據與員工績效評級相關的百分比來增加員工的工資。

示例

var mysql = require('mysql');
var con = mysql.createConnection({
   host: "localhost",
   user: "root",
   password: "mypassword",
   database: "mydb"
});

var qry =`
   UPDATE employees
      INNER JOIN
   merits ON employees.performance = merits.performance 
SET 
   salary = salary + salary * percentage;
   `;
con.connect(function (err) {
   if (err) throw err;
   console.log("Connected!");

   con.query(qry, nm, function(err) {
      if (err) throw err;
      con.query(qry,nm, function (err, results) {
         if (err) throw err;
         console.log(results);
      });
   });
});

輸出

OkPacket {
  fieldCount: 0,
  affectedRows: 7,
  insertId: 0,
  serverStatus: 34,
  warningCount: 0,
  message: '(Rows matched: 7  Changed: 6  Warnings: 0',
  protocol41: true,
  changedRows: 6
}

檢查 employees 表中更新後的 salary 欄位:

mysql> select * from employees;
+--------+---------------+-------------+--------+
| emp_id | emp_name      | performance | salary |
+--------+---------------+-------------+--------+
|      1 | Mary Doe      |           1 |  50000 |
|      2 | Cindy Smith   |           3 |  66950 |
|      3 | Sue Greenspan |           4 |  78750 |
|      4 | Grace Dell    |           5 | 135000 |
|      5 | Nancy Johnson |           3 |  87550 |
|      6 | John Doe      |           2 |  45450 |
|      7 | Lily Bush     |           3 |  56650 |
+--------+---------------+-------------+--------+
7 rows in set (0.00 sec)
廣告