| <?xml version="1.0" encoding="UTF-8"?> |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| --> |
| <!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd"> |
| <concept id="update" rev="kudu"> |
| |
| <title>UPDATE Statement (<keyword keyref="impala28"/> or higher only)</title> |
| <titlealts audience="PDF"><navtitle>UPDATE</navtitle></titlealts> |
| <prolog> |
| <metadata> |
| <data name="Category" value="Impala"/> |
| <data name="Category" value="SQL"/> |
| <data name="Category" value="Kudu"/> |
| <data name="Category" value="ETL"/> |
| <data name="Category" value="Ingest"/> |
| <data name="Category" value="DML"/> |
| <data name="Category" value="Developers"/> |
| <data name="Category" value="Data Analysts"/> |
| </metadata> |
| </prolog> |
| |
| <conbody> |
| |
| <p> |
| <indexterm audience="hidden">UPDATE statement</indexterm> |
| Updates an arbitrary number of rows in a Kudu table. |
| This statement only works for Impala tables that use the Kudu storage engine. |
| </p> |
| |
| <p conref="../shared/impala_common.xml#common/syntax_blurb"/> |
| |
| <codeblock> |
| UPDATE [<varname>database_name</varname>.]<varname>table_name</varname> SET <varname>col</varname> = <varname>val</varname> [, <varname>col</varname> = <varname>val</varname> ... ] |
| [ FROM <varname>joined_table_refs</varname> ] |
| [ WHERE <varname>where_conditions</varname> ] |
| </codeblock> |
| |
| <p conref="../shared/impala_common.xml#common/usage_notes_blurb"/> |
| |
| <p> |
| None of the columns that make up the primary key can be updated by the |
| <codeph>SET</codeph> clause. |
| </p> |
| |
| <p> |
| The conditions in the <codeph>WHERE</codeph> clause are the same ones allowed |
| for the <codeph>SELECT</codeph> statement. See <xref href="impala_select.xml#select"/> |
| for details. |
| </p> |
| |
| <p> |
| If the <codeph>WHERE</codeph> clause is omitted, all rows in the table are updated. |
| </p> |
| |
| <p> |
| The conditions in the <codeph>WHERE</codeph> clause can refer to |
| any combination of primary key columns or other columns. Referring to |
| primary key columns in the <codeph>WHERE</codeph> clause is more efficient |
| than referring to non-primary key columns. |
| </p> |
| |
| <p> |
| Because Kudu currently does not enforce strong consistency during concurrent DML operations, |
| be aware that the results after this statement finishes might be different than you |
| intuitively expect: |
| </p> |
| <ul> |
| <li> |
| <p> |
| If some rows cannot be updated because their |
| some primary key columns are not found, due to their being deleted |
| by a concurrent <codeph>DELETE</codeph> operation, |
| the statement succeeds but returns a warning. |
| </p> |
| </li> |
| <li> |
| <p> |
| An <codeph>UPDATE</codeph> statement might also overlap with |
| <codeph>INSERT</codeph>, <codeph>UPDATE</codeph>, |
| or <codeph>UPSERT</codeph> statements running concurrently on the same table. |
| After the statement finishes, there might be more or fewer matching rows than expected |
| in the table because it is undefined whether the <codeph>UPDATE</codeph> applies to rows |
| that are inserted or updated while the <codeph>UPDATE</codeph> is in progress. |
| </p> |
| </li> |
| </ul> |
| |
| <p> |
| The number of affected rows is reported in an <cmdname>impala-shell</cmdname> message |
| and in the query profile. |
| </p> |
| |
| <p> |
| The optional <codeph>FROM</codeph> clause lets you restrict the |
| updates to only the rows in the specified table that are part |
| of the result set for a join query. The join clauses can include |
| non-Kudu tables, but the table from which the rows are deleted |
| must be a Kudu table. |
| </p> |
| |
| <p conref="../shared/impala_common.xml#common/dml_blurb_kudu"/> |
| |
| <note conref="../shared/impala_common.xml#common/compute_stats_next"/> |
| |
| <p conref="../shared/impala_common.xml#common/example_blurb"/> |
| |
| <p> |
| The following examples show how to perform a simple update |
| on a table, with or without a <codeph>WHERE</codeph> clause: |
| </p> |
| |
| <codeblock> |
| -- Set all rows to the same value for column c3. |
| -- In this case, c1 and c2 are primary key columns |
| -- and so cannot be updated. |
| UPDATE kudu_table SET c3 = 'not applicable'; |
| |
| -- Update only the rows that match the condition. |
| UPDATE kudu_table SET c3 = NULL WHERE c1 > 100 AND c3 IS NULL; |
| |
| -- Does not update any rows, because the WHERE condition is always false. |
| UPDATE kudu_table SET c3 = 'impossible' WHERE 1 = 0; |
| |
| -- Change the values of multiple columns in a single UPDATE statement. |
| UPDATE kudu_table SET c3 = upper(c3), c4 = FALSE, c5 = 0 WHERE c6 = TRUE; |
| </codeblock> |
| |
| <p> |
| The following examples show how to perform an update using the |
| <codeph>FROM</codeph> keyword with a join clause: |
| </p> |
| |
| <codeblock> |
| -- Uppercase a column value, only for rows that have |
| -- an ID that matches the value from another table. |
| UPDATE kudu_table SET c3 = upper(c3) |
| FROM kudu_table JOIN non_kudu_table |
| ON kudu_table.id = non_kudu_table.id; |
| |
| -- Same effect as previous statement. |
| -- Assign table aliases in FROM clause, then refer to |
| -- short names elsewhere in the statement. |
| UPDATE t1 SET c3 = upper(c3) |
| FROM kudu_table t1 JOIN non_kudu_table t2 |
| ON t1.id = t2.id; |
| |
| -- Same effect as previous statements, but more efficient. |
| -- Use WHERE clause to skip updating values that are |
| -- already uppercase. |
| UPDATE t1 SET c3 = upper(c3) |
| FROM kudu_table t1 JOIN non_kudu_table t2 |
| ON t1.id = t2.id |
| WHERE c3 != upper(c3); |
| </codeblock> |
| |
| <p conref="../shared/impala_common.xml#common/related_info"/> |
| |
| <p> |
| <xref href="impala_kudu.xml#impala_kudu"/>, <xref href="impala_insert.xml#insert"/>, |
| <xref href="impala_delete.xml#delete"/>, <xref href="impala_upsert.xml#upsert"/> |
| </p> |
| |
| </conbody> |
| |
| </concept> |