SQL Update
SQL UPDATE 语句
Section titled “SQL UPDATE 语句”SQL 中的 UPDATE 语句用于修改表中的现有记录(行)。它允许您更改与指定条件匹配的行的(一个或多个)列的值。
SQL UPDATE 语句解释
Section titled “SQL UPDATE 语句解释”UPDATE 语句使用 WHERE 子句定位特定的行,并为这些行更改指定列的值。
SQL UPDATE 语法
Section titled “SQL UPDATE 语法”UPDATE table_name SET column1 = value1, column2 = value2, … WHERE condition;
table_name:要更新的表的名称。SET column1 = value1, column2 = value2, ...:要更新的列及其新值的逗号分隔列表。值可以是字面量、表达式或子查询结果(取决于 RDBMS)。WHERE condition:一个可选子句,指定要更新哪些行。如果省略,**表中的所有行都将被更新**。
我们使用一个概念性的 “Customers” 表进行示例。
初始的 “Customers” 表数据:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
SQL UPDATE 示例
Section titled “SQL UPDATE 示例”假设我们要更新客户 “Alfreds Futterkiste” 的联系人和城市。最好在 WHERE 子句中使用唯一标识符,如 CustomerID。
我们使用以下 SQL 语句(假设 ‘Alfreds Futterkiste’ 的 CustomerID 是 1):
UPDATE CustomersSET ContactName = 'Alfred Schmidt', City = 'Hamburg'WHERE CustomerID = 1;如果 CustomerID 未知,您可以使用其他条件,但如果它不是唯一的,请谨慎:
UPDATE CustomersSET ContactName = 'Alfred Schmidt', City = 'Hamburg'WHERE CustomerName = 'Alfreds Futterkiste';此更新后(定位到 CustomerID = 1),从 “Customers” 表中查询的结果将如下所示:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Alfred Schmidt | Obere Str. 57 | Hamburg | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
| 4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
您可以在一个 UPDATE 语句中更新多个列,只需在 SET 子句中用逗号分隔赋值,如上面的示例所示。
示例:将某个类别中所有产品的价格提高 10%,并将其标记为 ‘Special Offer’。(概念性的 ‘Products’ 表)
UPDATE ProductsSET Price = Price * 1.10, Status = 'Special Offer'WHERE CategoryID = 5;更新警告!省略 WHERE 子句的危险性
Section titled “更新警告!省略 WHERE 子句的危险性”更新记录时要极其小心。如果您省略 WHERE 子句,表中的所有记录都将被更新。例如,如果执行以下语句:
UPDATE Customers SET ContactName = ‘Global Contact’, City = ‘Default City’;
那么,“Customers” 表中的所有行都将被更改:
| CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
|---|---|---|---|---|---|---|
| 1 | Alfreds Futterkiste | Global Contact | Obere Str. 57 | Default City | 12209 | Germany |
| 2 | Ana Trujillo Emparedados y helados | Global Contact | Avda. de la Constitución 2222 | Default City | 05021 | Mexico |
| 3 | Antonio Moreno Taquería | Global Contact | Mataderos 2312 | Default City | 05023 | Mexico |
| 4 | Around the Horn | Global Contact | 120 Hanover Sq. | Default City | WA1 1DP | UK |
这通常不是预期的行为,可能导致严重的数据丢失或损坏。
UPDATE 的最佳实践:
Section titled “UPDATE 的最佳实践:”- 始终使用
WHERE子句,除非您明确打算更新所有行。 - 为了精确性,首选在
WHERE子句中使用主键或唯一标识符。 - **先用
SELECT测试:**在运行UPDATE之前,编写一个使用相同WHERE子句的SELECT语句,以验证将影响哪些行。 - **备份您的数据:**尤其是在生产环境中运行大规模或复杂的
UPDATE语句之前。 - **使用事务(Transactions):**对于多个相关的更新,或者如果您需要回滚的能力,请在事务中执行
UPDATE语句(BEGIN TRANSACTION、COMMIT、ROLLBACK)。
一些 RDBMS 还支持基于另一个表中的值来更新一个表中的行,这通常在 UPDATE 语句中使用 JOIN 或子查询(subquery)。这种语法的细节更高级,并且因 RDBMS 而异。