暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【手写数据库核心揭秘系列】118节 DELETE删除演示,带条件精准删除与火力覆盖式的删除所有

开源无限 2025-08-19
154
💻 深耕数据库内核架构设计与开发十余年,曾主导多款高性能分布式数据库内核研发,攻克高并发、低延迟等核心技术难题。现倾力打造《从零手写数据库》系列教程,首次系统性公开数据库内核源码级实现细节!
🚀 从存储引擎、查询优化到分布式事务,手把手拆解核心模块;从语法解析树构建到执行计划生成,逐行代码还原设计精髓
🌟 无论你是数据库开发者、系统架构师,还是对底层技术充满好奇的极客,这里都有你想要的“硬核干货”!点击关注,与行业老兵共同探索数据库技术的星辰大海!
公众号:开源无限


一、概述 


至此数据表的增删改查四个基本操作已经全部实现,现在我们来看一下删除命令的效果。

二、数据准备 


  • 创建数据表

仓库信息表warehouses,同时向表中插入一些数据。

    CREATE TABLE inventory ( product_id varchar,    product_name varchar,     sku varchar,     category varchar,     quantity integer ,  min_stock integer ,  max_stock integer ,  w_id integer ,  location varchar, last_received varchar,  last_sold varchar,  created_at varchar,  updated_at varchar ) ;
    • 插入数据
      INSERT INTO inventory VALUES ('P001', 'Smart Watch', 'SKU001', 'Electronics', 150205001, 'A1-01', '2023-10-01', '2023-10-10', '2023-10-15 10:00:00', '2023-10-15 10:00:00');
      INSERT INTO inventory VALUES('P002', 'Bluetooth Headset', 'SKU002', 'Audio', 200306001, 'A1-02', '2023-10-02', '2023-10-11', '2023-10-15 10:05:00', '2023-10-15 10:05:00');
      INSERT INTO inventory VALUES('P003', 'Wireless Charger', 'SKU003', 'Accessories', 80103002, 'B2-03', '2023-10-03', '2023-10-12', '2023-10-15 10:10:00', '2023-10-15 10:10:00');
      INSERT INTO inventory VALUES('P004', 'Tablet', 'SKU004', 'Electronics', 120154002, 'B2-04', '2023-10-04', '2023-10-13', '2023-10-15 10:15:00', '2023-10-15 10:15:00');
      INSERT INTO inventory VALUES('P005', 'Gaming Keyboard', 'SKU005', 'Peripherals', 90253503, 'C3-05', '2023-10-05', '2023-10-14', '2023-10-15 10:20:00', '2023-10-15 10:20:00');
      INSERT INTO inventory VALUES('P006', 'Mechanical Mouse', 'SKU006', 'Peripherals', 110204503, 'C3-06', '2023-10-06', '2023-10-15', '2023-10-15 10:25:00', '2023-10-15 10:25:00');
      INSERT INTO inventory VALUES('P007', 'HD Webcam', 'SKU007', 'Imaging', 70152504, 'D4-07', '2023-10-07', '2023-10-10', '2023-10-15 10:30:00', '2023-10-15 10:30:00');
      INSERT INTO inventory VALUES('P008', 'Portable Speaker', 'SKU008', 'Audio', 180255504, 'D4-08', '2023-10-08', '2023-10-11', '2023-10-15 10:35:00', '2023-10-15 10:35:00');
      INSERT INTO inventory VALUES('P009', 'Fitness Tracker', 'SKU009', 'Health', 130304505, 'E5-09', '2023-10-09', '2023-10-12', '2023-10-15 10:40:00', '2023-10-15 10:40:00');
      INSERT INTO inventory VALUES('P010', 'Smart Glasses', 'SKU010', 'Wearables', 60102005, 'E5-10', '2023-10-10', '2023-10-13', '2023-10-15 10:45:00', '2023-10-15 10:45:00');
      • 查询数据情况
        miniToad <select * from warehouses;
        |w_id    |name            |address                   |capacity |manager        |
        |1       |Warehouse A     |123 Main St, City A       |5000     |Manager 1      |
        |2       |Warehouse B     |456 Elm St, City B        |7000     |Manager 2      |
        |3       |Warehouse C     |789 Oak St, City C        |6000     |Manager 3      |
        |4       |Warehouse D     |101 Pine St, City D       |8000     |Manager 4      |
        |5       |Warehouse E     |202 Maple St, City E      |4500     |Manager 5      |
        |6       |Warehouse F     |303 Birch St, City F      |5500     |Manager 6      |
        |7       |Warehouse G     |404 Cedar St, City G      |7500     |Manager 7      |
        |8       |Warehouse H     |505 Walnut St, City H     |6500     |Manager 8      |
        |9       |Warehouse I     |606 Cherry St, City I     |9000     |Manager 9      |
        |10      |Warehouse J     |707 Beech St, City J      |8500     |Manager 10     |
        excutor return 10 rows

        三、删除数据 


        根据删除的数据数量,分为单条数据删除、多条数据批量删除、多个范围的数据删除和整表数据删除。


        3.1 单条数据删除 

        使用条件过滤,删除1号仓库的信息。

          miniToad <delete from warehouses where w_id=1;
          excutor delete 1 rows
          miniToad <select * from warehouses;
          |w_id    |name            |address                   |capacity |manager        |
          |2       |Warehouse B     |456 Elm St, City B        |7000     |Manager 2      |
          |3       |Warehouse C     |789 Oak St, City C        |6000     |Manager 3      |
          |4       |Warehouse D     |101 Pine St, City D       |8000     |Manager 4      |
          |5       |Warehouse E     |202 Maple St, City E      |4500     |Manager 5      |
          |6       |Warehouse F     |303 Birch St, City F      |5500     |Manager 6      |
          |7       |Warehouse G     |404 Cedar St, City G      |7500     |Manager 7      |
          |8       |Warehouse H     |505 Walnut St, City H     |6500     |Manager 8      |
          |9       |Warehouse I     |606 Cherry St, City I     |9000     |Manager 9      |
          |10      |Warehouse J     |707 Beech St, City J      |8500     |Manager 10     |
          excutor return 9 rows


          3.2 多条批量删除  

          通过条件过滤,可以同时删除多条行数据。

            miniToad <delete from warehouses where capacity > 8000 or manager = 'Manager 2';
            excutor delete 3 rows
            miniToad <select * from warehouses;
            |w_id    |name            |address                   |capacity |manager        |
            |3       |Warehouse C     |789 Oak St, City C        |6000     |Manager 3      |
            |4       |Warehouse D     |101 Pine St, City D       |8000     |Manager 4      |
            |5       |Warehouse E     |202 Maple St, City E      |4500     |Manager 5      |
            |6       |Warehouse F     |303 Birch St, City F      |5500     |Manager 6      |
            |7       |Warehouse G     |404 Cedar St, City G      |7500     |Manager 7      |
            |8       |Warehouse H     |505 Walnut St, City H     |6500     |Manager 8      |
            excutor return 6 rows

            每条数据行删除时,会将它占用的空间也会释放到数据块,其后的数据会被移动并占据空隙,表数据块的可用空间会增加。


            3.3 删除全表数据  

            DELETE命令中,不带过滤条件时,表示删除数据表中的所有数据行。

              miniToad <delete from warehouses;
              excutor delete 6 rows
              miniToad <select * from warehouses;
              excutor return 0 rows

              此时数据表中虽然没有数据,但是数据表文件所占的空间并没有减少;当再次插入数据时,会被重复利用。在其它数据库中,删除所有数据的同时要释放表文件占用的空间,可以使用truncate数据表,类似于对文件进行了截断。

              四、总结 


              盆友们,自己开发数据库内核的实现,已经完成了增、删、改、查四个基本操作,你们都学会了吗?

              接下来,我们将对这一过程再进行总结和复盘,想学习的要抓紧上车了。


              🌟 点赞收藏,分享给身边的技术伙伴,关注我们,持续获取数据库内核开发的硬核干货!一起从源码级实现到分布式架构,解锁数据库技术的每一个核心细节!🚀

              【往期精彩推荐】

              【手写数据库核心揭秘系列】第117节 DELETE执行器,三大删除策略,你选择那一种?

              【手写数据库核心揭秘系列】DELET命令的物理执行树全貌

              【手写数据库内核miniToadb】第115节 DELETE命令逻辑执行计划



              文章转载自开源无限,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论