受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

6.2. 更新数据 #

修改数据库中已有的数据称为更新。你可以更新单独的行、表中的所有行,或者所有行中的一个子集。每一列都可以单独更新;其他列不受影响。

要更新现有的行,可使用UPDATE 命令。这需要三部分信息:

  1. 要更新的表名和列名

  2. 列的新值

  3. 要更新哪一行(或哪些行)

回想一下Chapter 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 子句中的等号表示比较,但这不会造成歧义。当然, WHERE 条件不必是等值测试。还有许多其他操作符可用(见Chapter 9)。不过,该表达式必须计算出一个布尔结果。

你可以在一条UPDATE命令中更新多个列,只需在 SET子句中列出多个赋值。例如:

UPDATE mytable SET a = 5, b = 3, c = 1 WHERE a > 0;

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。