删除数据

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

开始前准备

已完成单机部署 MatrixOne

删除数据 SQL 语句

你可以通过三种方式删除数据:DROP TABLETRUNCATE TABLEDELETE 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 在执行 DELETEDROPTRUNCATE 语句后,并不会立即从磁盘中删除数据,而是将这些数据标记为可删除状态。随后,GC(垃圾回收)机制会定期进行扫描,并清理不再需要的旧数据。

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

示例

  • 示例 1
  1. -- 创建表
  2. CREATE TABLE employees (
  3. id INT PRIMARY KEY,
  4. name VARCHAR(50),
  5. department VARCHAR(50)
  6. );
  7. -- 插入数据
  8. INSERT INTO employees (id, name, department)
  9. VALUES (1, 'John Doe', 'HR'),
  10. (2, 'Jane Smith', 'Marketing'),
  11. (3, 'Mike Johnson', 'IT'),
  12. (4, 'Emily Brown', 'Finance');
  13. -- 查看初始数据
  14. mysql> SELECT * FROM employees;
  15. +------+--------------+------------+
  16. | id | name | department |
  17. +------+--------------+------------+
  18. | 1 | John Doe | HR |
  19. | 2 | Jane Smith | Marketing |
  20. | 3 | Mike Johnson | IT |
  21. | 4 | Emily Brown | Finance |
  22. +------+--------------+------------+
  23. 4 rows in set (0.01 sec)
  24. -- 删除部分数据
  25. mysql> DELETE FROM employees WHERE department = 'IT';
  26. Query OK, 1 row affected (0.01 sec)
  27. -- 查看删除后的数据
  28. mysql> SELECT * FROM employees;
  29. +------+-------------+------------+
  30. | id | name | department |
  31. +------+-------------+------------+
  32. | 1 | John Doe | HR |
  33. | 2 | Jane Smith | Marketing |
  34. | 4 | Emily Brown | Finance |
  35. +------+-------------+------------+
  36. 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. );
  7. -- 插入数据
  8. INSERT INTO orders (order_id, customer_name, order_date)
  9. VALUES (1, 'John Doe', '2022-01-01'),
  10. (2, 'Jane Smith', '2022-02-01'),
  11. (3, 'Mike Johnson', '2022-03-01'),
  12. (4, 'Emily Brown', '2022-04-01'),
  13. (5, 'David Wilson', '2022-05-01');
  14. -- 查看初始数据
  15. mysql> SELECT * FROM orders;
  16. +----------+---------------+------------+
  17. | order_id | customer_name | order_date |
  18. +----------+---------------+------------+
  19. | 1 | John Doe | 2022-01-01 |
  20. | 2 | Jane Smith | 2022-02-01 |
  21. | 3 | Mike Johnson | 2022-03-01 |
  22. | 4 | Emily Brown | 2022-04-01 |
  23. | 5 | David Wilson | 2022-05-01 |
  24. +----------+---------------+------------+
  25. 5 rows in set (0.01 sec)
  26. -- 删除最早的两个订单
  27. mysql> DELETE FROM orders
  28. WHERE order_id IN (
  29. SELECT order_id
  30. FROM orders
  31. ORDER BY order_date
  32. LIMIT 2);
  33. Query OK, 2 rows affected (0.01 sec)
  34. -- 查看删除后的数据
  35. mysql> SELECT * FROM orders;
  36. +----------+---------------+------------+
  37. | order_id | customer_name | order_date |
  38. +----------+---------------+------------+
  39. | 3 | Mike Johnson | 2022-03-01 |
  40. | 4 | Emily Brown | 2022-04-01 |
  41. | 5 | David Wilson | 2022-05-01 |
  42. +----------+---------------+------------+
  43. 3 rows in set (0.01 sec)