blob: c8591b6bbc6b380d8ce6300649c402d0d1922bbe [file] [log] [blame]
<?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="delete" rev="kudu">
<title>DELETE Statement (<keyword keyref="impala28"/> or higher only)</title>
<titlealts audience="PDF"><navtitle>DELETE</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">DELETE statement</indexterm>
Deletes an arbitrary number of rows from 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>
DELETE [FROM] [<varname>database_name</varname>.]<varname>table_name</varname> [ WHERE <varname>where_conditions</varname> ]
DELETE <varname>table_ref</varname> FROM [<varname>joined_table_refs</varname>] [ WHERE <varname>where_conditions</varname> ]
</codeblock>
<p>
The first form evaluates rows from one table against an optional
<codeph>WHERE</codeph> clause, and deletes all the rows that
match the <codeph>WHERE</codeph> conditions, or all rows if
<codeph>WHERE</codeph> is omitted.
</p>
<p>
The second form evaluates one or more join clauses, and deletes
all matching rows from one of the tables. The join clauses can
include non-Kudu tables, but the table from which the rows
are deleted must be a Kudu table. The <codeph>FROM</codeph>
keyword is required in this case, to separate the name of
the table whose rows are being deleted from the table names
of the join clauses.
</p>
<p conref="../shared/impala_common.xml#common/usage_notes_blurb"/>
<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>
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>
If the <codeph>WHERE</codeph> clause is omitted, all rows are removed from the table.
</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 deleted 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>
A <codeph>DELETE</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 rows than expected in the table
because it is undefined whether the <codeph>DELETE</codeph> applies to rows that are
inserted or updated while the <codeph>DELETE</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 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 delete rows from a specified
table, either all rows or rows that match a <codeph>WHERE</codeph>
clause:
</p>
<codeblock>
-- Deletes all rows. The FROM keyword is optional.
DELETE FROM kudu_table;
DELETE kudu_table;
-- Deletes 0, 1, or more rows.
-- (If c1 is a single-column primary key, the statement could only
-- delete 0 or 1 rows.)
DELETE FROM kudu_table WHERE c1 = 100;
-- Deletes all rows that match all the WHERE conditions.
DELETE FROM kudu_table WHERE
(c1 > c2 OR c3 IN ('hello','world')) AND c4 IS NOT NULL;
DELETE FROM t1 WHERE
(c1 IN (1,2,3) AND c2 > c3) OR c4 IS NOT NULL;
DELETE FROM time_series WHERE
year = 2016 AND month IN (11,12) AND day > 15;
-- WHERE condition with a subquery.
DELETE FROM t1 WHERE
c5 IN (SELECT DISTINCT other_col FROM other_table);
-- Does not delete any rows, because the WHERE condition is always false.
DELETE FROM kudu_table WHERE 1 = 0;
</codeblock>
<p>
The following examples show how to delete rows that are part
of the result set from a join:
</p>
<codeblock>
-- Remove _all_ rows from t1 that have a matching X value in t2.
DELETE t1 FROM t1 JOIN t2 ON t1.x = t2.x;
-- Remove _some_ rows from t1 that have a matching X value in t2.
DELETE t1 FROM t1 JOIN t2 ON t1.x = t2.x
WHERE t1.y = FALSE and t2.z > 100;
-- Delete from a Kudu table based on a join with a non-Kudu table.
DELETE t1 FROM kudu_table t1 JOIN non_kudu_table t2 ON t1.x = t2.x;
-- The tables can be joined in any order as long as the Kudu table
-- is specified as the deletion target.
DELETE t2 FROM non_kudu_table t1 JOIN kudu_table t2 ON t1.x = t2.x;
</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_update.xml#update"/>, <xref href="impala_upsert.xml#upsert"/>
</p>
</conbody>
</concept>