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;