删除数据

本文档介绍如何使用 SQL 语句在 MatrixOne 中删除数据。

开始前准备

已完成单机部署 MatrixOne。

删除数据 SQL 语句

你可以通过三种方式删除数据:DROP TABLE、TRUNCATE TABLE 和 DELETE TABLE。

三者的区别是:

  • DELETE TABLE:当你要删除部分记录时,用 DELETE TABLE。
  • TRUNCATE TABLE:当你仍要保留该表,表的结构、索引和约束等都需要保持不变,但要删除所有记录时,用 TRUNCATE TABLE。
  • DROP TABLE:当你不再需要该表时,用 DROP TABLE。

DELETE

1. DELETE FROM tbl_name [[AS] tbl_alias]
2. [WHERE where_condition]
3. [ORDER BY ...]
4. [LIMIT row_count]
  1. DELETE FROM tbl_name:指定要从表中删除数据的目标表。tbl_name 是表的名称。
  2. [AS] tbl_alias(可选):可以使用 AS 关键字为目标表指定一个表别名(tbl_alias)。别名是可选的,用于简化查询并在语句中引用表。
  3. [WHERE where_condition](可选):WHERE 子句用于指定删除数据的条件。只有满足指定条件的行才会被删除。where_condition 是一个逻辑表达式,可以使用各种比较运算符和逻辑运算符来定义条件。
  4. [ORDER BY ...](可选):ORDER BY 子句用于按指定的列对要删除的行进行排序。可以使用一个或多个列,并可以指定升序(ASC)或降序(DESC)排序。排序将影响删除的行的顺序。
  5. [LIMIT row_count](可选):LIMIT 子句用于限制从表中删除的行数。它指定要删除的最大行数(row_count)。如果未指定 LIMIT 子句,则将删除满足 WHERE 条件的所有行。

TRUNCATE

1. > TRUNCATE [TABLE] table_name;

TRUNCATE 语句用于删除表中的所有数据,保留表的结构。它将快速清空表,而不是逐行删除数据。

  • [TABLE](可选)关键字用于提供更清晰的语法,但在大多数数据库系统中可以省略。
  • table_name 是要进行操作的目标表的名称。

DROP

1. > DROP TABLE [IF EXISTS] [db.]name

DROP TABLE 语句用于完全删除数据库中的表,包括表的结构和数据。

  • [IF EXISTS](可选)关键字表示如果表存在,则执行删除操作。如果省略此关键字,并且要删除的表不存在,将引发错误。
  • [db.](可选)指定表所在的数据库名称。如果未提供数据库名称,则默认为当前数据库。
  • name 是要删除的表的名称。

GC(Garbage Collection)机制

在默认配置下,MatrixOne 在执行 DELETE、DROP 或 TRUNCATE 语句后,并不会立即从磁盘中删除数据,而是将这些数据标记为可删除状态。随后,GC(垃圾回收)机制会定期进行扫描,并清理不再需要的旧数据。

默认情况下,垃圾回收机制每隔 30 分钟进行一次扫描。每次扫描会查找超过 1 小时通过 SQL 语句被删除的数据,并开始清理操作,以释放磁盘空间。完成所有清理的最长周期为 90 分钟。因此,需要注意的是,执行 DELETE、DROP 或 TRUNCATE 语句并不会立即减少磁盘使用量。只有在垃圾回收过程中,被标记为可删除的数据才会被清理并释放空间。

示例

  • 示例 1
1. -- 创建表
2. CREATE TABLE employees (
3. id INT PRIMARY KEY,
4. name VARCHAR(50),
5. department VARCHAR(50)
6. );

8. -- 插入数据
9. INSERT INTO employees (id, name, department)
10. VALUES (1, 'John Doe', 'HR'),
11. (2, 'Jane Smith', 'Marketing'),
12. (3, 'Mike Johnson', 'IT'),
13. (4, 'Emily Brown', 'Finance');

15. -- 查看初始数据
16. mysql> SELECT * FROM employees;
17. +------+--------------+------------+
18. | id   | name         | department |
19. +------+--------------+------------+
20. |    1 | John Doe     | HR         |
21. |    2 | Jane Smith   | Marketing  |
22. |    3 | Mike Johnson | IT         |
23. |    4 | Emily Brown  | Finance    |
24. +------+--------------+------------+
25. 4 rows in set (0.01 sec)

27. -- 删除部分数据
28. mysql> DELETE FROM employees WHERE department = 'IT';
29. Query OK, 1 row affected (0.01 sec)

31. -- 查看删除后的数据
32. mysql> SELECT * FROM employees;
33. +------+-------------+------------+
34. | id   | name        | department |
35. +------+-------------+------------+
36. |    1 | John Doe    | HR         |
37. |    2 | Jane Smith  | Marketing  |
38. |    4 | Emily Brown | Finance    |
39. +------+-------------+------------+
40. 3 rows in set (0.00 sec)
  • 示例 2
1. -- 创建表
2. CREATE TABLE orders (
3. order_id INT PRIMARY KEY,
4. customer_name VARCHAR(50),
5. order_date DATE
6. );

8. -- 插入数据
9. INSERT INTO orders (order_id, customer_name, order_date)
10. VALUES (1, 'John Doe', '2022-01-01'),
11. (2, 'Jane Smith', '2022-02-01'),
12. (3, 'Mike Johnson', '2022-03-01'),
13. (4, 'Emily Brown', '2022-04-01'),
14. (5, 'David Wilson', '2022-05-01');

16. -- 查看初始数据
17. mysql> SELECT * FROM orders;
18. +----------+---------------+------------+
19. | order_id | customer_name | order_date |
20. +----------+---------------+------------+
21. |        1 | John Doe      | 2022-01-01 |
22. |        2 | Jane Smith    | 2022-02-01 |
23. |        3 | Mike Johnson  | 2022-03-01 |
24. |        4 | Emily Brown   | 2022-04-01 |
25. |        5 | David Wilson  | 2022-05-01 |
26. +----------+---------------+------------+
27. 5 rows in set (0.01 sec)

29. -- 删除最早的两个订单
30. mysql> DELETE FROM orders
31. WHERE order_id IN (
32. SELECT order_id
33. FROM orders
34. ORDER BY order_date
35. LIMIT 2);
36. Query OK, 2 rows affected (0.01 sec)

38. -- 查看删除后的数据
39. mysql> SELECT * FROM orders;
40. +----------+---------------+------------+
41. | order_id | customer_name | order_date |
42. +----------+---------------+------------+
43. |        3 | Mike Johnson  | 2022-03-01 |
44. |        4 | Emily Brown   | 2022-04-01 |
45. |        5 | David Wilson  | 2022-05-01 |
46. +----------+---------------+------------+
47. 3 rows in set (0.01 sec)