UPDATE
Описание
Эта инструкция используется для обновления данных. В настоящее время инструкция UPDATE поддерживает только модель UNIQUE KEY.
В настоящее время операция UPDATE поддерживает обновление только столбца Value. Об обновлении столбца Key см. Обновление столбца Key с помощью FlinkCDC.
Синтаксис
[cte]
UPDATE target_table [table_alias]
SET assignment_list
[ FROM additional_tables]
[WHERE condition]
[ORDER BY column [ASC | DESC] [NULLS FIRST | NULLS LAST] [, ...]]
[LIMIT [offset,] count]
Обязательные параметры
- target_table: Целевая таблица, данные которой нужно обновить. Может быть указана в формате 'db_name.table_name'
- assignment_list: Столбцы для обновления в формате 'col_name = value, col_name = value'
Необязательные параметры
- cte: Общее табличное выражение, например 'WITH a AS SELECT * FROM tbl'
- table_alias: Псевдоним таблицы
- FROM additional_tables: Указывает одну или несколько таблиц для отбора строк, подлежащих обновлению, или для задания новых значений. Если здесь нужно использовать целевую таблицу, необходимо явно задать для неё псевдоним.
- WHERE condition: Условие отбора строк для обновления, представляющее собой выражение, которое возвращает true или false.
- ORDER BY column: Задаёт порядок обновления строк. Обычно используется вместе с LIMIT, чтобы определить, какие строки будут затронуты.
- LIMIT [offset,] count: Ограничивает количество обновляемых строк. При использовании с ORDER BY обновляет первые
countстрок после сортировки. Если указанoffset, перед обновлением пропускает первыеoffsetстрок. При использовании без ORDER BY набор затрагиваемых строк не определён однозначно.
Примечание
В настоящее время инструкция UPDATE поддерживает обновление строк только в модели UNIQUE KEY.
Если не указаны ни WHERE, ни LIMIT, будут обновлены все строки таблицы. Прежде чем опускать предложение WHERE, обязательно проверьте, какие строки должны быть обновлены.
Пример
Таблица test использует модель UNIQUE KEY и содержит четыре столбца: k1, k2, v1, v2. Столбцы k1, k2 являются ключами, v1, v2 содержат значения, а в качестве метода агрегации используется Replace.
- Установить значение 1 в столбце v1 таблицы 'test' для строк, удовлетворяющих условиям k1 =1 , k2 =2
UPDATE test SET v1 = 1 WHERE k1=1 and k2=2;
- Увеличить значение столбца v1 на 1 в строках таблицы 'test', где k1=1
UPDATE test SET v1 = v1+1 WHERE k1=1;
- Использовать результат соединения
t2сt3для обновленияt1
-- create t1, t2, t3 tables
CREATE TABLE t1
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
UNIQUE KEY (id)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1', "function_column.sequence_col" = "c4");
CREATE TABLE t2
(id INT, c1 BIGINT, c2 STRING, c3 DOUBLE, c4 DATE)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');
CREATE TABLE t3
(id INT)
DISTRIBUTED BY HASH (id)
PROPERTIES('replication_num'='1');
-- insert data
INSERT INTO t1 VALUES
(1, 1, '1', 1.0, '2000-01-01'),
(2, 2, '2', 2.0, '2000-01-02'),
(3, 3, '3', 3.0, '2000-01-03');
INSERT INTO t2 VALUES
(1, 10, '10', 10.0, '2000-01-10'),
(2, 20, '20', 20.0, '2000-01-20'),
(3, 30, '30', 30.0, '2000-01-30'),
(4, 4, '4', 4.0, '2000-01-04'),
(5, 5, '5', 5.0, '2000-01-05');
INSERT INTO t3 VALUES
(1),
(4),
(5);
-- update t1
UPDATE t1
SET t1.c1 = t2.c1, t1.c3 = t2.c3 * 100
FROM t2 INNER JOIN t3 ON t2.id = t3.id
WHERE t1.id = t2.id;
Ожидаемый результат: в таблице t1 обновится только строка, где id = 1
+----+----+----+--------+------------+
| id | c1 | c2 | c3 | c4 |
+----+----+----+--------+------------+
| 1 | 10 | 1 | 1000.0 | 2000-01-01 |
| 2 | 2 | 2 | 2.0 | 2000-01-02 |
| 3 | 3 | 3 | 3.0 | 2000-01-03 |
+----+----+----+--------+------------+
- Использование cte
create table orders(
o_orderkey bigint,
o_totalprice decimal(15, 2)
) unique key(o_orderkey)
distributed by hash(o_orderkey) buckets 1
properties (
"replication_num" = "1"
);
insert into orders values
(1, 34.1),
(2, 432.8);
create table lineitem(
l_linenumber int,
o_orderkey bigint,
l_discount decimal(15, 2)
) unique key(l_linenumber)
distributed by hash(l_linenumber) buckets 1
properties (
"replication_num" = "1"
);
insert into lineitem values
(1, 1, 1.23),
(2, 1, 3.21),
(3, 2, 18.08),
(4, 2, 23.48);
with discount_orders as (
select * from orders
where o_totalprice > 100
)
update lineitem set l_discount = l_discount*0.9
from discount_orders
where lineitem.o_orderkey = discount_orders.o_orderkey;
- Обновление с ORDER BY и LIMIT: установить значение 0 в столбце v1 для первых 3 строк с наибольшими значениями v1, где k1 > 0
UPDATE test SET v1 = 0 WHERE k1 > 0 ORDER BY v1 DESC LIMIT 3;
- Обновление с ORDER BY, LIMIT и offset: пропустить первые 10 строк и обновить следующие 5 строк при сортировке по k1
UPDATE test SET v1 = 100 ORDER BY k1 ASC LIMIT 10, 5;
Ключевые слова
UPDATE