分享到

简介

许多数据库表管理的数据需要不时更改或更新。SQL UPDATE 命令可以通过允许您更改表中记录中存储的值来帮助解决这些情况。

要更新记录,您必须提供将发生更改的列及其新值。为了告诉 MySQL 要定位哪些记录,您还需要提供匹配条件,以便它可以确定要更改的行。在本文中,我们将讨论如何使用 UPDATE 一次更改一个或批量更改表数据的值。

使用 UPDATE 修改数据

UPDATE 命令的基本语法如下所示

UPDATE <table>
SET
<column1> = <value1>,
<column2> = <value2>
WHERE
<match_condition>;

如上所示,基本结构涉及三个独立的子句

  • 指定要操作的表,
  • 提供您希望更新的列以及它们的新值,以及
  • 定义标准以确定要匹配的记录

成功提交后,MySQL 通过输出匹配和更改的行数来确认操作

Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0

基于另一张表中的值更新记录

基于提供新的外部数据进行的更新相对简单。您只需要提供表、列、新值和目标条件。

但是,您也可以使用 UPDATE 根据存储在联接表中的信息有条件地更新表值。基本语法如下所示

UPDATE <table1>, <table2>
SET <table1>.<column1> = <table2>.<column1>
WHERE <table1>.<column2> = <table2>.<column2>;

在这里,我们将 table1 表中 column1 的值更新为 table2column1 中存储的值,但仅在 table1column2table2column2 匹配的行中。即使值仅在一张表中更改,我们也需要将两张表都添加到 UPDATE 操作的表列表中。WHERE 结构指定了联接两个表的联接条件。

例如,假设我们有两张表,分别名为 filmdirector

CREATE TABLE director (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
latest_film VARCHAR(200)
);
CREATE TABLE film (
id SERIAL PRIMARY KEY,
title VARCHAR(200) NOT NULL,
director_id INT REFERENCES director(id),
release_date DATE NOT NULL
);
INSERT INTO director (name)
VALUES
('frank'),
('bob'),
('sue');
INSERT INTO film (title, director_id, release_date)
VALUES
('first movie', 1, '2010-08-24'),
('second movie', 1, '2010-12-15'),
('third movie', 2, '2011-01-01'),
('fourth movie', 2, '2012-08-02');

这两张表与引用 director.idfilm.director_id 有关。目前,director 表的 latest_filmNULL。但是,我们可以使用 WHERE 子句将两张表放在一起来填充它,其中包含导演的最新电影标题。

在这里,我们使用 WITH 子句创建一个名为 latest_films 的公共表表达式 (CTE),我们可以在 UPDATE 语句中引用它

WITH latest_films AS (
SELECT
f1.*
FROM
film f1
WHERE
f1.id = (SELECT
f2.id
FROM
film f2
WHERE
f2.director_id = f1.director_id
ORDER BY f2.release_date DESC LIMIT 1))
UPDATE
director, latest_films
SET
director.latest_film = latest_films.title
WHERE
director.id = latest_films.director_id;

如果您查询 director 表,它现在应该显示每位导演的最新电影

SELECT * FROM director;
+----+-------+--------------+
id | name | latest_film |
+----+-------+--------------+
1 | frank | second movie |
2 | bob | fourth movie |
3 | sue | NULL |
+----+-------+--------------+
3 rows in set (0.00 sec)

结论

在本文中,我们演示了如何使用 UPDATE 命令来更改现有 MySQL 记录的值。UPDATE 命令与其他 SQL 结构结合使用时非常灵活,允许您根据整个数据库中找到的条件和值以有趣的方式修改数据。当您熟悉该操作后,您将能够找到更改数据以满足您需求的新方法。

关于作者
Justin Ellingwood

Justin Ellingwood

自 2013 年以来,Justin 一直在撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。