删除数据
本文档介绍如何使用 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]
DELETE FROM tbl_name:指定要从表中删除数据的目标表。tbl_name 是表的名称。[AS] tbl_alias(可选):可以使用 AS 关键字为目标表指定一个表别名(tbl_alias)。别名是可选的,用于简化查询并在语句中引用表。[WHERE where_condition](可选):WHERE 子句用于指定删除数据的条件。只有满足指定条件的行才会被删除。where_condition 是一个逻辑表达式,可以使用各种比较运算符和逻辑运算符来定义条件。[ORDER BY ...](可选):ORDER BY 子句用于按指定的列对要删除的行进行排序。可以使用一个或多个列,并可以指定升序(ASC)或降序(DESC)排序。排序将影响删除的行的顺序。[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)
