6.2. 更新資料

修改已經儲存在資料庫中的資料的行為叫做更新。您可以更新 獨立的行,也可以更新資料表中所有的行,還可以更新其中的一部分行。 我們可以獨立地更新每個字串,而其他的字串則不受影響。

要執行一次更新,您需要三種訊息:

  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;