6.2. 更新数据 #
对数据库中已有数据的修改称为更新。你可以更新单独的行、表中的所有行或所有行的一个子集。每一列都可以单独更新;其他列不受影响。
要执行一次更新,你需要三条信息:
要更新的表和列的名称,
列的新值,
要更新哪些行。
回想第 5 章中所说的,SQL 一般不为行提供唯一的标识符。因此不一定能直接指定要更新哪一行。相反,你指定的是行必须满足什么条件才会被更新。只有当表中有主键时(无论你是否声明了它),你才能通过选择一个与主键匹配的条件来可靠地定位单独的行。图形化的数据库访问工具正是依靠这一点来让你逐行更新的。
例如,这条命令把所有价格为 5 的产品的价格更新为 10:
UPDATE products SET price = 10 WHERE price = 5;
这可能导致零行、一行或多行被更新。尝试一次不匹配任何行的更新并不是错误。
让我们详细看看这条命令:首先是关键字UPDATE,后跟表名。与通常一样,表名可以是模式限定的,否则将在路径中查找。接下来是关键字SET,后跟列名、一个等号和列的新值。新的列值可以是任何标量表达式,而不仅仅是常量。例如,如果你想把所有产品的价格提高 10%,可以使用:
UPDATE products SET price = price * 1.10;
如你所见,新值的表达式也可以引用旧值。我们还省略了
WHERE子句。如果省略它,就意味着表中的所有行都被更新。如果给出它,则只有满足WHERE
之后条件的那些行被更新。注意,SET子句中的等号是赋值,而WHERE子句中的等号是比较,但这不会产生任何歧义。当然,条件不必是相等测试。还有许多其他操作符可用(见第 9 章)。但表达式必须求值为布尔结果。
你也可以在一条UPDATE命令中更新多列,方法是在SET子句中列出多个赋值。例如:
UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;