Skip to content

sql-update-query

SQL UPDATE 语句用于修改表中的现有记录。它是一种强大的数据操作语言(Data Manipulation Language, DML)命令,可以根据你指定的条件更改单行、多行或所有行中的数据。

警告:UPDATE 语句可能会永久性地更改你的数据。务必谨慎,并使用 WHERE 子句来限制更改的范围。如果忘记使用 WHERE 子句,将会更新表中的每一行!

UPDATE 语句的基本结构涉及指定表、要更改的列、它们的新值以及用于标识要更新哪些行的条件。

UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;

考虑一个 Products 表。我们来更新由 ProductID 标识的特定产品的价格。

/* 首先,让我们查看产品的当前状态 */
SELECT ProductName, Price FROM Products WHERE ProductID = 101;
-- 假设初始价格为 19.99
UPDATE Products
SET Price = 24.99
WHERE ProductID = 101;

此查询只会影响 ProductID 为 101 的行。

你可以通过提供匹配多条记录的 WHERE 子句来更新多行。例如,我们对特定类别中的所有产品应用 10% 的折扣。

UPDATE Products
SET Price = Price * 0.90
WHERE Category = 'Electronics';

从另一个表更新(带 JOIN 的 UPDATE)

Section titled “从另一个表更新(带 JOIN 的 UPDATE)”

一种常见需求是根据另一个表中的值来更新一个表。其语法因 SQL 方言而异。

PostgreSQL 语法:

-- 使用 'new_stock_levels' 表中的信息更新 'products' 表中的库存数量。
UPDATE products p
SET stock_quantity = s.new_quantity
FROM new_stock_levels s
WHERE p.product_id = s.product_id;

SQL Server / MySQL 语法:

-- 同样的目标,但在 UPDATE 语句中使用 JOIN 语法。
UPDATE products p
JOIN new_stock_levels s ON p.product_id = s.product_id
SET p.stock_quantity = s.new_quantity;
  • 使用事务:将你的 UPDATE 语句封装在事务中。这允许你预览更改,并在不正确时回滚(ROLLBACK),在正确时提交(COMMIT)。
  • UPDATE 前先 SELECT:在运行复杂的 UPDATE 之前,先编写一个带有完全相同 WHERE 子句的 SELECT 语句。这将精确地显示哪些行会受到影响。
  • 明确指定:更新单行时,始终在 WHERE 子句中使用主键,以确保你不会意外更新其他行。
  • 检查性能:更新大量行可能会锁定表并影响应用程序性能。考虑在非高峰时段执行大型更新。
BEGIN TRANSACTION;
-- 我们打算运行的 UPDATE 语句
UPDATE Employees
SET Salary = Salary * 1.05
WHERE DepartmentID = 4;
-- 在提交前检查结果
SELECT EmployeeID, Salary FROM Employees WHERE DepartmentID = 4;
-- 如果一切看起来正确,则提交更改。
-- COMMIT;
-- 如果出现问题,回滚到原始状态。
-- ROLLBACK;