<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # UPDATE ## Name UPDATE?--?更新一個表中的行 ## Synopsis ``` [ WITH [ RECURSIVE ] _with_query_ [, ...] ] UPDATE [ ONLY ] _table_name_ [ * ] [ [ AS ] _alias_ ] SET { _column_name_ = { _expression_ | DEFAULT } | ( _column_name_ [, ...] ) = ( { _expression_ | DEFAULT } [, ...] ) } [, ...] [ FROM _from_list_ ] [ WHERE _condition_ | WHERE CURRENT OF _cursor_name_ ] [ RETURNING * | _output_expression_ [ [ AS ] _output_name_ ] [, ...] ] ``` ## 描述 `UPDATE`改變滿足條件的所有行中指定的字段值。 只在`SET`子句中出現需要修改的行,沒有出現的其他字段保持它們原來的數值。 使用同一數據庫里其它表的信息來更新一個表有兩種方法:使用子查詢, 或者在`FROM`子句里聲明另外一個表。哪個方法更好取決于具體的環境。 可選的`RETURNING`子句將導致`UPDATE`基于每個被更新的行計算返回值。 任何使用表的字段的表達式或`FROM`中使用的其他表的字段都可以用于計算。 計算的時候使用剛剛被更新過的字段新值。`RETURNING` 列表的語法與`SELECT`的輸出列表相同。 你必須對表或至少在列出的要被更新的字段上有`UPDATE`權限, 同樣在`_expressions_` 或`_condition_` 條件里提到的任何字段上也要有`SELECT`權限。 ## 參數 `_with_query_` `WITH`子句允許聲明一個或多個可以在`UPDATE` 查詢中通過名字引用的子查詢。參閱[Section 7.8](#calibre_link-515) 和 [SELECT](#calibre_link-104)獲取詳細信息。 `_table_name_` 要更新的表的名稱(可以有模式修飾)。如果在表名前聲明了`ONLY`, 那么只在該表中更新匹配的行。如果沒有聲明`ONLY`,那么該表的任何繼承表內的匹配行也要更新。 可選的,可以在表名后面聲明`*`以明確表明包含后代表。 `_alias_` 目標表的別名。如果指定了別名,那么它將完全遮蓋表的本名。例如,給定 `UPDATE foo AS f`之后,剩余的`UPDATE` 語句必須用`f`而不是`foo`引用這個表。 `_column_name_` 表`_table_name_`中的字段名。必要時, 字段名可以用子域名或者數組下標修飾。不要在指定字段名的時候加上表名字。 比如`UPDATE tab SET tab.col = 1`就是錯誤的。 `_expression_` 給字段賦值的表達式。表達式可以使用這個或其它字段更新前的舊值。 `DEFAULT` 把字段設置為它的缺省值,如果沒有缺省表達式,那么就是 NULL。 `_from_list_` 一個表表達式的列表,允許來自其它表中的字段出現在`WHERE`條件里和更新表達式中。 這個類似于可以在一個`SELECT`語句的[_FROM_ 子句](#calibre_link-516) 子句里聲明表列表。請注意目標表絕對不能出現在`_from_list_`里, 除非你是在使用一個自連接(此時它必須以`_from_list_`的別名出現)。 `_condition_` 一個返回`boolean`結果的表達式。只有這個表達式返回`true`的行才會被更新。 `_cursor_name_` 在`WHERE CURRENT OF`條件下使用的游標的名稱。要更新的行是最近從該游標中抓去的行。 該游標必須是一個`UPDATE`目標表中的非分組查詢。請注意`WHERE CURRENT OF` 不能與布爾條件一起聲明。參閱[DECLARE](#calibre_link-72)獲取更多關于通過 `WHERE CURRENT OF`使用游標的信息。 `_output_expression_` 在所有需要更新的行都被更新之后,`UPDATE`命令用于計算返回值的表達式。 這個表達式可以使用任何`_table_name_` 命名的表以及`FROM`中列出的表的字段。寫上`*`表示返回所有字段。 `_output_name_` 字段的返回名稱。 ## Outputs 成功完成后,`UPDATE`返回形如 ``` UPDATE _count_ ``` 的命令標簽。`_count_`是更新的行數, 包括沒有改變值的匹配行。請注意當更新受到`BEFORE UPDATE`觸發器的抑制時, 這個數字可能小于匹配`_condition_`的行數。 如果`_count_`為 0,則沒有行被這個查詢更新 (這個不認為是錯誤)。 如果`UPDATE`包含`RETURNING`子句,那么返回的結果將類似于包含在 `RETURNING`列表中定義的字段和值的`SELECT`語句, 只不過返回結果是基于被更新的行而已。 ## 注意 在出現`FROM`子句的時候,實際上發生的事情是目標表和`_from_list_` 里提到的表連接在一起,并且每個連接輸出行都代表一個目標表的更新操作。 在使用`FROM`的時候,你應該保證連接為每個需要修改的行最多生成一個輸出行。 換句話說,一個目標行不應該和超過一行來自其它表的數據行連接。如果它連接了多于一個行, 那么連接行里面將會只有一行用于更新目標行,但是究竟使用哪行是很難預期的事情。 因為這個不確定性,只在子查詢里面引用其它表是安全的,盡管通常更難讀并且比使用連接也更慢些。 ## 例子 把表`films`里的字段`kind`里的詞 `Drama`用`Dramatic`代替: ``` UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama'; ``` 調整表`weather`中的某行的溫度并把該行的降水量設置為缺省值: ``` UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03'; ``` 做同樣的事情并返回更新后的條目: ``` UPDATE weather SET temp_lo = temp_lo+1, temp_hi = temp_lo+15, prcp = DEFAULT WHERE city = 'San Francisco' AND date = '2003-07-03' RETURNING temp_lo, temp_hi, prcp; ``` 使用另一種字段列表語法來做同樣的事情: ``` UPDATE weather SET (temp_lo, temp_hi, prcp) = (temp_lo+1, temp_lo+15, DEFAULT) WHERE city = 'San Francisco' AND date = '2003-07-03'; ``` 增加負責 Acme 公司客戶的銷售員的銷售計數,使用`FROM`子句語法: ``` UPDATE employees SET sales_count = sales_count + 1 FROM accounts WHERE accounts.name = 'Acme Corporation' AND employees.id = accounts.sales_person; ``` 使用`WHERE`子句里的子查詢執行同樣的操作: ``` UPDATE employees SET sales_count = sales_count + 1 WHERE id = (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation'); ``` 試圖帶著庫存量插入一個新的庫存項。如果該項存在,則更新現有項的庫存數。 要做這件事情而又不使整個事務失效,使用保留點。 ``` BEGIN; -- 其它操作 SAVEPOINT sp1; INSERT INTO wines VALUES('Chateau Lafite 2003', '24'); -- 假設上面因為一個唯一鍵字違例而失效, -- 因此現在發出這些命令: ROLLBACK TO sp1; UPDATE wines SET stock = stock + 24 WHERE winename = 'Chateau Lafite 2003'; -- 繼續其它操作,最后 COMMIT; ``` 更改表`films`的`kind`列, 在游標`c_films`目前定位的行上: ``` UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films; ``` ## 兼容性 這條命令遵循SQL標準。只是`FROM`和`RETURNING` 子句是PostgreSQL擴展,就像和`UPDATE`一起使用`WITH`。 標準的字段列表語法允許從行值表達式指定字段列表,比如一個子查詢: ``` UPDATE accounts SET (contact_last_name, contact_first_name) = (SELECT last_name, first_name FROM salesmen WHERE salesmen.id = accounts.sales_id); ``` 這個功能目前尚未實現:源必須是一個獨立的表達式。 有些其它數據庫系統提供一個`FROM`選項,在這個選項下, 認為目標表會再次在`FROM`里列出。這不是PostgreSQL 解析`FROM`的方式。移植使用這類擴展的應用時要注意。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看