Перейти к основному содержимому

UPDATE

Обновляет строки в таблице с первичным ключом.

Selena поддерживает оператор UPDATE начиная с версии 1.5.0, который поддерживает только UPDATE одной таблицы и не поддерживает общие табличные выражения (CTE). Начиная с версии 1.5.0, Selena расширяет синтаксис для поддержки соединений нескольких таблиц и CTE. Если вам нужно соединить обновляемую таблицу с другими таблицами в базе данных, вы можете ссылаться на эти другие таблицы в предложении FROM или CTE. Начиная с версии 1.5.0, оператор UPDATE поддерживает частичные обновления в режиме столбцов, что подходит для сценариев с небольшим количеством столбцов, но большим количеством строк, что приводит к более быстрой скорости обновления.

Эта команда требует привилегию UPDATE для таблицы, которую вы хотите обновить.

Примечания по использованию

При выполнении оператора UPDATE с участием нескольких таблиц, Selena преобразует табличное выражение в предложении FROM оператора UPDATE в эквивалентный оператор запроса JOIN. Поэтому убедитесь, что табличное выражение, которое вы указываете в предложении FROM оператора UPDATE, поддерживает это преобразование. Например, оператор UPDATE: 'UPDATE t0 SET v1=t1.v1 FROM t1 WHERE t0.pk = t1.pk;'. Табличное выражение в предложении FROM может быть преобразовано в 't0 JOIN t1 ON t0.pk=t1.pk;'. Selena сопоставляет строки данных для обновления на основе результирующего набора запроса JOIN. Возможно, что несколько строк в результирующем наборе соответствуют определенной строке в обновляемой таблице. В этом сценарии эта строка обновляется на основе значения случайной строки среди этих нескольких строк.

Синтаксис

UPDATE одной таблицы

Если строки данных обновляемой таблицы соответствуют условию WHERE, указанным столбцам этих строк данных присваиваются новые значения.

[ WITH <with_query> [, ...] ]
UPDATE <table_name>
SET <column_name> = <expression> [, ...]
WHERE <where_condition>

UPDATE нескольких таблиц

Результирующий набор от соединения нескольких таблиц сопоставляется с обновляемой таблицей. Если строки данных обновляемой таблицы соответствуют результирующему набору и удовлетворяют условию WHERE, указанным столбцам этих строк данных присваиваются новые значения.

[ WITH <with_query> [, ...] ]
UPDATE <table_name>
SET <column_name> = <expression> [, ...]
[ FROM <from_item> [, ...] ]
WHERE <where_condition>

Параметры

with_query

Одно или несколько CTE, на которые можно ссылаться по имени в операторе UPDATE. CTE — это временные результирующие наборы, которые могут улучшить читаемость сложных операторов.

table_name

Имя обновляемой таблицы.

column_name

Имя обновляемого столбца. Оно не может включать имя таблицы. Например, 'UPDATE t1 SET col = 1' недопустимо.

expression

Выражение, которое присваивает новые значения столбцу.

from_item

Одна или несколько других таблиц в базе данных. Эти таблицы могут быть соединены с обновляемой таблицей на основе условия, указанного в предложении WHERE. Значения строк в результирующем наборе используются для обновления значений указанных столбцов в соответствующих строках обновляемой таблицы. Например, если предложение FROM имеет вид FROM t1 WHERE t0.pk = t1.pk, Selena преобразует табличное выражение в предложении FROM в t0 JOIN t1 ON t0.pk=t1.pk при выполнении оператора UPDATE.

where_condition

Условие, на основе которого вы хотите обновить строки. Только строки, которые соответствуют условию WHERE, могут быть обновлены. Этот параметр обязателен, поскольку он помогает предотвратить случайное обновление всей таблицы. Если вы хотите обновить всю таблицу, вы можете использовать 'WHERE true'. Однако этот параметр не требуется для частичных обновлений в режиме столбцов.

Частичные обновления в режиме столбцов (начиная с v3.1)

Частичные обновления в режиме столбцов подходят для сценариев, где нужно обновить только небольшое количество столбцов, но большое количество строк. В таких сценариях включение режима столбцов обеспечивает более быструю скорость обновления. Например, в таблице со 100 столбцами, если обновляются только 10 столбцов (10% от общего количества) для всех строк, скорость обновления в режиме столбцов в 10 раз быстрее.

Системная переменная partial_update_mode управляет режимом частичных обновлений и поддерживает следующие значения:

  • auto (по умолчанию): Система автоматически определяет режим частичных обновлений, анализируя оператор UPDATE и задействованные столбцы. Если выполняются следующие критерии, система автоматически использует режим столбцов:

    • Процент обновляемых столбцов по сравнению с общим количеством столбцов составляет менее 30%, и количество обновляемых столбцов меньше 4.
    • Оператор обновления не использует условие WHERE.

    В противном случае система не использует режим столбцов.

  • column: Режим столбцов используется для частичных обновлений, что особенно подходит для частичных обновлений, которые затрагивают небольшое количество столбцов и большое количество строк.

Вы можете использовать EXPLAIN UPDATE xxx для просмотра режима частичных обновлений.

Примеры

UPDATE одной таблицы

Создайте таблицу Employees для записи информации о сотрудниках и вставьте пять строк данных в таблицу.

CREATE TABLE Employees (
EmployeeID INT,
Name VARCHAR(50),
Salary DECIMAL(10, 2)
)
PRIMARY KEY (EmployeeID)
DISTRIBUTED BY HASH (EmployeeID)
PROPERTIES ("replication_num" = "3");

INSERT INTO Employees VALUES
(1, 'John Doe', 5000),
(2, 'Jane Smith', 6000),
(3, 'Robert Johnson', 5500),
(4, 'Emily Williams', 4500),
(5, 'Michael Brown', 7000);

Если вам нужно повысить зарплату всем сотрудникам на 10%, вы можете выполнить следующий оператор:

UPDATE Employees
SET Salary = Salary * 1.1 -- Увеличить зарплату на 10%.
WHERE true;

Если вам нужно повысить зарплату на 10% сотрудникам с зарплатой ниже средней зарплаты, вы можете выполнить следующий оператор:

UPDATE Employees
SET Salary = Salary * 1.1 -- Увеличить зарплату на 10%.
WHERE Salary < (SELECT AVG(Salary) FROM Employees);

Вы также можете использовать CTE для переписывания приведенного выше оператора для улучшения читаемости.

WITH AvgSalary AS (
SELECT AVG(Salary) AS AverageSalary
FROM Employees
)
UPDATE Employees
SET Salary = Salary * 1.1 -- Увеличить зарплату на 10%.
FROM AvgSalary
WHERE Employees.Salary < AvgSalary.AverageSalary;

UPDATE нескольких таблиц

Создайте таблицу Accounts для записи информации об аккаунтах и вставьте три строки данных в таблицу.

CREATE TABLE Accounts (
Accounts_id BIGINT NOT NULL,
Name VARCHAR(26) NOT NULL,
Sales_person VARCHAR(50) NOT NULL
)
PRIMARY KEY (Accounts_id)
DISTRIBUTED BY HASH (Accounts_id)
PROPERTIES ("replication_num" = "3");

INSERT INTO Accounts VALUES
(1,'Acme Corporation','John Doe'),
(2,'Acme Corporation','Robert Johnson'),
(3,'Acme Corporation','Lily Swift');

Если вам нужно повысить зарплату на 10% сотрудникам в таблице Employees, которые управляют аккаунтами для Acme Corporation, вы можете выполнить следующий оператор:

UPDATE Employees
SET Salary = Salary * 1.1 -- Увеличить зарплату на 10%.
FROM Accounts
WHERE Accounts.name = 'Acme Corporation'
AND Employees.Name = Accounts.Sales_person;

Вы также можете использовать CTE для переписывания приведенного выше оператора для улучшения читаемости.

WITH Acme_Accounts as (
SELECT * from Accounts
WHERE Accounts.name = 'Acme Corporation'
)
UPDATE Employees SET Salary = Salary * 1.1 -- Увеличить зарплату на 10%.
FROM Acme_Accounts
WHERE Employees.Name = Acme_Accounts.Sales_person;