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

DELETE

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

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

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

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

Таблицы 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 могут использоваться только ключевые столбцы.

  • Условия, которые вы указываете, должны быть в отношении 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

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

Синтаксис

[ 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" = "false"
);

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)

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

Удаление данных по первичному ключу

Вы можете указать первичный ключ в операторе 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" = "false"
);

Вставить данные в таблицу 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.