Skip to content

PostgreSQL - UPDATE

UPDATE 语句用于修改表中的现有记录。它几乎总是与 WHERE 子句一起使用,以指定要更新的行。如果没有 WHERE 子句,UPDATE 语句将修改表中的所有行,这可能是一个具有破坏性且意想不到的操作。

UPDATE table_name
SET column1 = value1,
column2 = value2,
...
WHERE condition;
  • table_name:你要更新的表。
  • SET column = value:要修改的列及其新值。
  • WHERE condition:标识要更新的特定行的条件。这是语句的关键部分。

我们来使用一个 products 表。首先,我们创建它并添加一些数据。

CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price NUMERIC(10, 2) NOT NULL,
stock_quantity INT
);
INSERT INTO products (name, price, stock_quantity) VALUES
('Laptop', 1200.00, 50),
('Keyboard', 75.50, 120),
('Mouse', 25.00, 200),
('Monitor', 300.00, 80);

现在,假设我们需要更正 ‘Mouse’ 的价格。我们可以使用其 id 或 name 进行更新。

UPDATE products
SET price = 26.50
WHERE name = 'Mouse';

执行此查询后,‘Mouse’ 行的价格将被更新。您可以通过 SELECT * FROM products WHERE name = 'Mouse'; 进行验证。

你可以更新符合条件的多个行。例如,让我们对所有价格超过 100 美元的产品应用 10% 的折扣。

UPDATE products
SET price = price * 0.90
WHERE price > 100.00;

这将更新 ‘Laptop’ 和 ‘Monitor’ 行。

PostgreSQL 的一个强大特性是 RETURNING 子句,它允许你获取刚刚更新的行的值。这在应用程序开发中非常有用,因为它避免了后续的 SELECT 查询。

让我们更新 ‘Keyboard’ 的库存,并立即查看更新后的行。

UPDATE products
SET stock_quantity = stock_quantity - 5
WHERE name = 'Keyboard'
RETURNING id, name, stock_quantity;

此查询不仅会更新数据库,还会返回以下结果:

id名称库存数量
2Keyboard115
  • 始终使用 WHERE 子句: 忘记 WHERE 子句是一个常见且危险的错误。它将更新表中的每一行。
  • 使用事务: 执行关键更新时,将 UPDATE 语句包装在事务中(BEGIN; ... COMMIT;)。这允许你在永久更改之前检查更改,或者在出现问题时 ROLLBACK。
  • 使用 SELECT 进行测试: 在运行 UPDATE 之前,你可以编写一个具有相同 WHERE 子句的 SELECT 语句,以预览将受影响的行。例如:SELECT * FROM products WHERE price > 100.00;。
  • 使用主键: 在更新单个特定行时,最安全的方法是在 WHERE 子句中使用主键(例如,WHERE id = 3),因为它保证你只针对一条记录。