清空表

本文介绍了TRUNCATE语句的使用方法及其与DELETE语句的区别。TRUNCATE语句用于快速清空表中所有数据,操作速度快且不可回滚。文章详细解释了两种语句在性能、事务处理及对表结构影响等方面的差异。

 清空表

  如果你想删除表中所有数据,清空表,可以考虑使用DDL语言的TRUNCATE语句。TRUNCATE就像没有WHERE子句的DELETE命令一样。TRUNCATE将删除表中所有行。TRUNCATE不是DML语句是DDL语句,他和DELETE有不同的特点。

TRUNCATE TABLE (schema)table DROP(REUSE) STORAGE
  STORAGE子串是可选的,缺省是DROP STORAGE。当使用DROP STORAGE时将缩短表和表索引,将表收缩到最小范围,并重新设置NEXT参数。REUSE STORAGE不会缩短表或者调整NEXT参数。

  TRUNCATE和DELETE有以下几点区别

  1、TRUNCATE在各种表上无论是大的还是小的都非常快。如果有ROLLBACK命令DELETE将被撤销,而TRUNCATE则不会被撤销。

  2、TRUNCATE是一个DDL语言,向其他所有的DDL语言一样,他将被隐式提交,不能对TRUNCATE使用ROLLBACK命令。

  3、TRUNCATE将重新设置高水平线和所有的索引。在对整个表和索引进行完全浏览时,经过TRUNCATE操作后的表比DELETE操作后的表要快得多。

  4、TRUNCATE不能触发任何DELETE触发器。

  5、不能授予任何人清空他人的表的权限。

  6、当表被清空后表和表的索引讲重新设置成初始大小,而delete则不能。

  7、不能清空父表。

<think>为了清空,我们需要遍历链并释放每个节点,同时将链头指针置为NULL。由于链是动态分配的,我们需要确保在清空时正确释放每个节点的内存。 考虑到多线程环境,我们需要使用互斥锁来保护链操作,避免在清空的过程中有其他线程访问或修改链。 以下是清空的函数实现:</think>以下是清空的完整实现代码,包含线程安全保护和内存管理: ```c #include <rtthread.h> /** * @brief 安全清空(释放所有节点) * * 功能说明: * 1. 释放链所有节点内存 * 2. 重置链头指针为NULL * 3. 提供线程安全保护 * 4. 支持调试日志输出 */ void clear_card_list(void) { // 获取链互斥锁(如果已初始化) if (list_mutex) { rt_mutex_take(list_mutex, RT_WAITING_FOREVER); } rt_kprintf("Starting card list clearance...\n"); // 遍历释放所有节点 hb_card_node_t *current = card_list_head; int node_count = 0; while (current != RT_NULL) { hb_card_node_t *next = current->next; // 调试信息 rt_kprintf("Freeing node: %s (Prio: %d)\n", current->data.app_id, current->data.hb_prio); // 释放节点内存 rt_free(current); current = next; node_count++; } // 重置链头指针 card_list_head = RT_NULL; // 释放锁 if (list_mutex) { rt_mutex_release(list_mutex); } rt_kprintf("Cleared %d nodes. List is now empty.\n", node_count); } // 清空的高级封装(带安全检查和状态返回) rt_err_t safe_clear_card_list(void) { // 检查链是否已清空 if (card_list_head == RT_NULL) { rt_kprintf("Warning: List is already empty\n"); return RT_EOK; // 返回成功但无需操作 } // 执行清空操作 clear_card_list(); // 验证清空结果 if (card_list_head != RT_NULL) { rt_kprintf("Error: List clearance failed!\n"); return RT_ERROR; } return RT_EOK; } // 测试函数 void test_list_clearance(void) { // 创建测试数据 hb_card_data_info_t test_data[] = { {"Weather", 1, 5, true}, {"Music", 2, 3, true}, {"Calendar", 3, 7, false} }; // 填充链 for (int i = 0; i < sizeof(test_data)/sizeof(test_data[0]); i++) { card_list_add(&test_data[i]); } rt_kprintf("\nBefore clearance:\n"); print_card_list(); // 假设已实现打印函数 // 清空 rt_err_t result = safe_clear_card_list(); rt_kprintf("\nAfter clearance:\n"); print_card_list(); if (result == RT_EOK) { rt_kprintf("List cleared successfully\n"); } else { rt_kprintf("List clearance failed!\n"); } } MSH_CMD_EXPORT(test_list_clearance, "Test card list clearance"); ``` ### 关键实现细节: 1. **线程安全机制**: ```c if (list_mutex) { rt_mutex_take(list_mutex, RT_WAITING_FOREVER); } // ...清空操作... if (list_mutex) { rt_mutex_release(list_mutex); } ``` - 使用互斥锁保护整个清空过程 - 兼容未初始化锁的情况 - 防止清空过程中其他线程访问链 2. **内存管理**: ```c while (current != RT_NULL) { hb_card_node_t *next = current->next; rt_free(current); current = next; } ``` - 安全遍历释放所有节点 - 先保存下一个节点指针再释放当前节点 - 使用RT-Thread的内存管理API 3. **防御性编程**: ```c // 安全清空函数 rt_err_t safe_clear_card_list(void) { if (card_list_head == RT_NULL) { return RT_EOK; // 空链直接返回 } clear_card_list(); // 验证清空结果 return (card_list_head == RT_NULL) ? RT_EOK : RT_ERROR; } ``` - 检查链是否已为空 - 操作后验证清空结果 - 返回操作状态码 4. **调试支持**: - 记录释放的每个节点信息 - 统计释放的节点数量 - 明确的状态变更日志 ### 使用场景: 1. **系统重置时**: ```c void system_factory_reset(void) { // 清除所有配置 clear_configuration(); // 清空卡片链 safe_clear_card_list(); // 重新初始化默认卡片 init_default_cards(); } ``` 2. **模块卸载时**: ```c int card_module_unload(void) { // 停止相关服务 stop_card_services(); // 清空释放资源 if (safe_clear_card_list() != RT_EOK) { rt_kprintf("Failed to clear card list during unload\n"); return -1; } // 销毁互斥锁 if (list_mutex) { rt_mutex_delete(list_mutex); list_mutex = RT_NULL; } return 0; } ``` 3. **内存回收时**: ```c void reclaim_memory(void) { if (get_free_heap() < LOW_MEMORY_THRESHOLD) { rt_kprintf("Low memory! Clearing card list...\n"); safe_clear_card_list(); } } ``` ### 注意事项: 1. **数据一致性**: - 清空前确保没有其他模块持有节点指针 - 避免悬空指针问题(dangling pointers) 2. **资源释放**: - 如果节点数据包含动态分配的资源,需要先释放: ```c // 扩展释放函数(需在节点结构定义中增加资源指针) while (current) { if (current->data.custom_resource) { release_custom_resource(current->data.custom_resource); } // ...其他释放逻辑... } ``` 3. **多线程协作**: - 清空前通知所有观察者 ```c notify_listeners(LIST_CLEAR_NOTIFICATION); safe_clear_card_list(); ``` 4. **性能考量**: - 大型链清空可能引起系统延迟 - 考虑分批释放或后台任务处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值