Перейти к основному содержимому
Версия: 2.0.x

DELETE

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

Для Duplicate Key таблиц, Aggregate таблиц и Unique Key таблиц вы можете удалять данные из указанных партиций. Начиная с v1.5.2, Primary Key таблицы поддерживают полную семантику DELETE...WHERE, которая позволяет удалять строки данных на основе primary key, любого столбца или результатов подзапроса. Начиная с v1.5.2, Selena обогащает семантику DELETE...WHERE многотабличными соединениями и общими табличными выражениями (CTE). Если вам нужно соединить Primary Key таблицы с другими таблицами в базе данных, вы можете ссылаться на эти другие таблицы в предложении USING или CTE.

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

  • У вас должны быть привилегии на таблицу и базу данных, для которых вы хотите выполнить DELETE.
  • Частые операции DELETE не рекомендуются. При необходимости выполняйте такие операции в непиковые часы.
  • Операция DELETE удаляет только данные в таблице. Таблица остается. Чтобы удалить таблицу, выполните DROP TABLE.
  • Чтобы предотвратить случайное удаление данных во всей таблице, вы должны указать предложение WHERE в выражении DELETE.
  • Удаленные строки не очищаются немедленно. Они помечаются как "удаленные" и временно сохраняются в Segment. Физически строки удаляются только после завершения слияния версий данных (compaction).
  • Эта операция также удаляет данные материализованных представлений, которые ссылаются на эту таблицу.
  • Вы можете использовать системную переменную insert_timeout для установки времени ожидания для операций DELETE.

Duplicate Key таблицы, Aggregate таблицы и Unique Key таблицы

Синтаксис

DELETE FROM  [<db_name>.]<table_name> [PARTITION <partition_name>]
WHERE
column_name1 op { value | value_list } [ AND column_name2 op { value | value_list } ...]

Параметры

ПараметрОбязательныйОписание
db_nameНетБаза данных, к которой принадлежит целевая таблица. Если этот параметр не указан, по умолчанию используется текущая база данных.
table_nameДаТаблица, из которой вы хотите удалить данные.
partition_nameНетПартиция, из которой вы хотите удалить данные.
column_nameДаСтолбец, который вы хотите использовать в качестве условия DELETE. Вы можете указать один или несколько столбцов.
opДаОператор, используемый в условии DELETE. Поддерживаемые операторы: =, >, <, >=, <=, !=, IN и NOT IN.

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

  • Для Duplicate Key таблиц вы можете использовать любой столбец в качестве условия DELETE. Для Aggregate таблиц и Unique Key таблиц в качестве условия DELETE могут использоваться только key столбцы.

  • Условия, которые вы указываете, должны быть в отношении AND. Если вы хотите указать условия в отношении OR, вы должны указать условия в отдельных выражениях DELETE.

  • Для Duplicate Key таблиц, Aggregate таблиц и Unique Key таблиц выражение DELETE не поддерживает использование результатов подзапроса в качестве условий.

Воздействие

После выполнения выражения DELETE производительность запросов вашего кластера может ухудшиться на некоторый период времени (до завершения compaction). Степень ухудшения зависит от количества условий, которые вы указываете. Большее количество условий означает более высокую степень ухудшения.

Примеры

Создайте таблицу и вставьте данные

Следующий пример создает партиционированную Duplicate Key таблицу.

CREATE TABLE `my_table` (
`date` date NOT NULL,
`k1` int(11) NOT NULL COMMENT "",
`k2` varchar(65533) NULL DEFAULT "" COMMENT "")
DUPLICATE KEY(`date`)
PARTITION BY RANGE(`date`)
(
PARTITION p1 VALUES [('2022-03-11'), ('2022-03-12')),
PARTITION p2 VALUES [('2022-03-12'), ('2022-03-13'))
)
DISTRIBUTED BY HASH(`date`)
PROPERTIES
("replication_num" = "3");

INSERT INTO `my_table` VALUES
('2022-03-11', 3, 'abc'),
('2022-03-11', 2, 'acb'),
('2022-03-11', 4, 'abc'),
('2022-03-12', 2, 'bca'),
('2022-03-12', 4, 'cba'),
('2022-03-12', 5, 'cba');

Запросите данные

select * from my_table order by date;
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 3 | abc |
| 2022-03-11 | 2 | acb |
| 2022-03-11 | 4 | abc |
| 2022-03-12 | 2 | bca |
| 2022-03-12 | 4 | cba |
| 2022-03-12 | 5 | cba |
+------------+------+------+

Удалите данные

Удалите данные из указанной партиции

Удалите строки, значения k1 которых равны 3, из партиции p1.

DELETE FROM my_table PARTITION p1
WHERE k1 = 3;

-- Результат запроса показывает, что строки со значениями `k1` равными `3` удалены.

select * from my_table partition (p1);
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
| 2022-03-11 | 4 | abc |
+------------+------+------+
Удалите данные из указанной партиции с использованием AND

Удалите строки, значения k1 которых больше или равны 3 и значения k2 которых равны "abc", из партиции p1.

DELETE FROM my_table PARTITION p1
WHERE k1 >= 3 AND k2 = "abc";

select * from my_table partition (p1);
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
+------------+------+------+
Удалите данные из всех партиций

Удалите строки, значения k2 которых равны "abc" или "cba", из всех партиций.

DELETE FROM my_table
WHERE k2 in ("abc", "cba");

select * from my_table order by date;
+------------+------+------+
| date | k1 | k2 |
+------------+------+------+
| 2022-03-11 | 2 | acb |
| 2022-03-12 | 2 | bca |
+------------+------+------+

Primary Key таблицы

Начиная с v1.5.2, Primary Key таблицы поддерживают полную семантику DELETE...WHERE, которая позволяет удалять строки данных на основе primary key, любого столбца или подзапроса.

Синтаксис

[ WITH <with_query> [, ...] ]
DELETE FROM <table_name>
[ USING <from_item> [, ...] ]
[ WHERE <where_condition> ]

Параметры

ПараметрОбязательныйОписание
with_queryНетОдин или несколько CTE, на которые можно ссылаться по имени в выражении DELETE. CTE — это временные наборы результатов, которые могут улучшить читаемость сложных выражений.
table_nameДаТаблица, из которой вы хотите удалить данные.
from_itemНетОдна или несколько других таблиц в базе данных. Эти таблицы могут быть соединены с обрабатываемой таблицей на основе условия, указанного в предложении WHERE. На основе набора результатов запроса соединения Selena удаляет совпадающие строки из обрабатываемой таблицы. Например, если предложение USING — это USING t1 WHERE t0.pk = t1.pk;, Selena преобразует табличное выражение в предложении USING в t0 JOIN t1 ON t0.pk=t1.pk; при выполнении выражения DELETE.
where_conditionДаУсловие, на основе которого вы хотите удалить строки. Могут быть удалены только строки, соответствующие условию WHERE. Этот параметр является обязательным, поскольку он помогает предотвратить случайное удаление всей таблицы. Если вы хотите удалить всю таблицу, вы можете использовать 'WHERE true'.

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

  • Primary Key таблицы не поддерживают удаление данных из указанной партиции, например, DELETE FROM <table_name> PARTITION <partition_id> WHERE <where_condition>.
  • Поддерживаются следующие операторы сравнения: =, >, <, >=, <=, !=, IN, NOT IN.
  • Поддерживаются следующие логические операторы: AND и OR.
  • Вы не можете использовать выражение DELETE для выполнения одновременных операций DELETE или для удаления данных при загрузке данных. Если вы выполняете такие операции, атомарность, согласованность, изоляция и долговечность (ACID) транзакций могут не быть обеспечены.

Примеры

Создайте таблицу и вставьте данные

Создайте Primary Key таблицу с именем score_board:

CREATE TABLE `score_board` (
`id` int(11) NOT NULL COMMENT "",
`name` varchar(65533) NULL DEFAULT "" COMMENT "",
`score` int(11) NOT NULL DEFAULT "0" COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`id`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`id`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "true"
);

INSERT INTO score_board VALUES
(0, 'Jack', 21),
(1, 'Bob', 21),
(2, 'Stan', 21),
(3, 'Sam', 22);

Запросите данные

Выполните следующее выражение для вставки данных в таблицу score_board:

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 0 | Jack | 21 |
| 1 | Bob | 21 |
| 2 | Stan | 21 |
| 3 | Sam | 22 |
+------+------+------+
4 rows in set (0.00 sec)

Удалите данные

Удалите данные по primary key

Вы можете указать primary key в выражении DELETE, поэтому Selena не нужно сканировать всю таблицу.

Удалите строки, значения id которых равны 0, из таблицы score_board.

DELETE FROM score_board WHERE id = 0;

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 1 | Bob | 21 |
| 2 | Stan | 21 |
| 3 | Sam | 22 |
+------+------+------+
Удалите данные по условию

Пример 1: Удалите строки, значения score которых равны 22, из таблицы score_board.

DELETE FROM score_board WHERE score = 22;

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 0 | Jack | 21 |
| 1 | Bob | 21 |
| 2 | Stan | 21 |
+------+------+------+

Пример 2: Удалите строки, значения score которых меньше 22, из таблицы score_board.

DELETE FROM score_board WHERE score < 22;

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 3 | Sam | 22 |
+------+------+------+

Пример 3: Удалите строки, значения score которых меньше 22 и значения name которых не равны Bob, из таблицы score_board.

DELETE FROM score_board WHERE score < 22 and name != "Bob";

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 1 | Bob | 21 |
| 3 | Sam | 22 |
+------+------+------+
2 rows in set (0.00 sec)
Удалите данные по результату подзапроса

Вы можете вложить один или несколько подзапросов в выражение DELETE и использовать результаты подзапроса в качестве условий.

Перед удалением данных выполните следующее выражение для создания другой таблицы с именем users:

CREATE TABLE `users` (
`uid` int(11) NOT NULL COMMENT "",
`name` varchar(65533) NOT NULL COMMENT "",
`country` varchar(65533) NULL COMMENT ""
) ENGINE=OLAP
PRIMARY KEY(`uid`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`uid`)
PROPERTIES (
"replication_num" = "3",
"storage_format" = "DEFAULT",
"enable_persistent_index" = "true"
);

Вставьте данные в таблицу users:

INSERT INTO users VALUES
(0, "Jack", "China"),
(2, "Stan", "USA"),
(1, "Bob", "China"),
(3, "Sam", "USA");
select * from users;
+------+------+---------+
| uid | name | country |
+------+------+---------+
| 0 | Jack | China |
| 1 | Bob | China |
| 2 | Stan | USA |
| 3 | Sam | USA |
+------+------+---------+
4 rows in set (0.00 sec)

Вложите подзапрос, чтобы найти строки, значения country которых равны China, из таблицы users, и удалите строки, которые имеют те же значения name, что и строки, возвращенные из подзапроса, из таблицы score_board. Вы можете использовать один из следующих методов для достижения этой цели:

  • Метод 1
DELETE FROM score_board
WHERE name IN (select name from users where country = "China");

select * from score_board;
+------+------+------+
| id | name | score|
+------+------+------+
| 2 | Stan | 21 |
| 3 | Sam | 22 |
+------+------+------+
  • Метод 2
DELETE FROM score_board
WHERE EXISTS (select name from users
where score_board.name = users.name and country = "China");

select * from score_board;
+------+------+-------+
| id | name | score |
+------+------+-------+
| 2 | Stan | 21 |
| 3 | Sam | 22 |
+------+------+-------+
2 rows in set (0.00 sec)
Удалите данные с использованием многотабличного соединения или CTE

Чтобы удалить все фильмы, произведенные продюсером "foo", вы можете выполнить следующее выражение:

DELETE FROM films USING producers
WHERE producer_id = producers.id
AND producers.name = 'foo';

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

WITH foo_producers as (
SELECT * from producers
where producers.name = 'foo'
)
DELETE FROM films USING foo_producers
WHERE producer_id = foo_producers.id;

Ссылки

SHOW DELETE: запрашивает исторические операции DELETE, которые были успешно выполнены для Duplicate Key таблиц, Aggregate таблиц и Unique Key таблиц.