当前位置: 首页 > article >正文

【Oracle数据库指南】第06篇:Oracle DML语句与事务控制——数据操作与ACID特性深度解析

上一篇【第05篇】Oracle子查询与集合操作——嵌套查询与结果合并全解析下一篇【第07篇】SQL*Plus基础——登录、环境设置与缓冲区操作摘要本文全面讲解Oracle DML数据操作语言语句包括INSERT、UPDATE、DELETE和MERGE的详细用法以及Oracle事务管理的核心机制——COMMIT、ROLLBACK、SAVEPOINT。深入理解ACID特性和Oracle的多版本并发控制MVCC机制帮助读者写出正确、高效、安全的数据操作代码。一、引言DMLData Manipulation Language数据操作语言是数据库操作的核心负责数据的增删改。不同于DDL如CREATE TABLEDML语句不会自动提交需要显式执行COMMIT或ROLLBACK来完成事务。Oracle的DML操作具有以下特点多版本并发控制MVCC读操作不阻塞写操作写操作不阻塞读操作行级锁定DML只锁定受影响的行而非整张表撤销数据UNDO所有修改操作都有对应的撤销记录支持回滚二、INSERT语句2.1 基本INSERT-- 基本语法INSERT INTO 表名 [(列名列表)] VALUES (值列表)-- 方式1指定列名推荐INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary)VALUES(207,Zhang,Wei,ZWEI,TO_DATE(2024-03-01,YYYY-MM-DD),IT_PROG,6000);-- 方式2不指定列名值的顺序必须与表定义的列顺序完全一致不推荐INSERTINTOemployeesVALUES(208,Li,Mei,LMEI,18612345678,TO_DATE(2024-03-01,YYYY-MM-DD),SA_REP,5000,0.15,149,80);-- 插入NULL值INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary)VALUES(209,Wang,Gang,WGANG,SYSDATE,HR_REP,NULL);-- 显式NULL-- 插入部分列未指定的列自动填充NULL或默认值INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id)VALUES(210,Liu,Yang,LYANG,SYSDATE,FI_ACCOUNT);-- salary列未指定若有DEFAULT值则用DEFAULT否则为NULLCOMMIT;-- 提交事务2.2 基于子查询的INSERT-- INSERT ... SELECT将查询结果批量插入-- 将employees表中IT部门的员工信息备份到备份表CREATETABLEit_employees_backupASSELECT*FROMemployeesWHERE12;-- 创建空表DDL会自动提交INSERTINTOit_employees_backupSELECT*FROMemployeesWHEREdepartment_id60;SELECTCOUNT(*)FROMit_employees_backup;COMMIT;-- 跨表数据迁移只复制特定列INSERTINTOemployees_archive(employee_id,last_name,salary,dept_id,archive_date)SELECTemployee_id,last_name,salary,department_id,SYSDATEFROMemployeesWHEREhire_dateTO_DATE(2005-01-01,YYYY-MM-DD);COMMIT;2.3 多行INSERTINSERT ALL-- 无条件多行INSERT每行数据插入多个表INSERTALLINTOemployees_log(log_id,action,employee_id,log_time)VALUES(emp_log_seq.NEXTVAL,INSERT,211,SYSDATE)INTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary)VALUES(211,Chen,Fang,CFANG,SYSDATE,SA_REP,4500)SELECT*FROMDUAL;-- 条件多行INSERT根据条件决定插入哪些表INSERTALLWHENsalary5000THENINTOlow_salary_emp(employee_id,last_name,salary)VALUES(employee_id,last_name,salary)WHENsalaryBETWEEN5001AND10000THENINTOmid_salary_emp(employee_id,last_name,salary)VALUES(employee_id,last_name,salary)WHENsalary10000THENINTOhigh_salary_emp(employee_id,last_name,salary)VALUES(employee_id,last_name,salary)SELECTemployee_id,last_name,salaryFROMemployees;-- FIRST关键字找到第一个匹配条件后停止避免一行数据插入多个表INSERTFIRSTWHENsalary15000THENINTOexec_employeesVALUES(employee_id,last_name,salary)WHENsalary10000THENINTOsenior_employeesVALUES(employee_id,last_name,salary)WHENsalary5000THENINTOregular_employeesVALUES(employee_id,last_name,salary)ELSEINTOjunior_employeesVALUES(employee_id,last_name,salary)SELECTemployee_id,last_name,salaryFROMemployees;COMMIT;三、UPDATE语句3.1 基本UPDATE-- 语法UPDATE 表名 SET 列1值1 [, 列2值2 ...] [WHERE 条件]-- 警告没有WHERE子句的UPDATE会更新表中所有行-- 更新单列UPDATEemployeesSETsalarysalary*1.10WHEREdepartment_id60;-- IT部门涨薪10%-- 更新多列UPDATEemployeesSETsalary9000,job_idIT_MAN,commission_pctNULLWHEREemployee_id207;-- 使用表达式更新UPDATEemployeesSETsalaryCASEWHENjob_idIT_PROGTHENsalary*1.15WHENjob_idSA_REPTHENsalary*1.10ELSEsalary*1.05END,last_modified_dateSYSDATEWHEREdepartment_idIN(60,80);COMMIT;3.2 基于子查询的UPDATE-- 使用子查询的UPDATE根据另一张表的数据更新当前表-- 将员工薪资更新为其所在部门的平均薪资示例实际应慎用UPDATEemployees eSETsalary(SELECTAVG(salary)FROMemployeesWHEREdepartment_ide.department_id)WHEREdepartment_id60;ROLLBACK;-- 演示用回滚-- 使用子查询同时更新多列UPDATEemployees eSET(salary,job_id)(SELECTAVG(salary),MAX(job_id)FROMemployeesWHEREdepartment_id60)WHEREemployee_id207;ROLLBACK;-- 基于另一张表的条件更新UPDATEemployeesSETsalarysalary*1.20WHEREdepartment_idIN(SELECTdepartment_idFROMdepartmentsWHERElocation_id1700);COMMIT;四、DELETE语句4.1 基本DELETE-- 语法DELETE [FROM] 表名 [WHERE 条件]-- 警告没有WHERE子句的DELETE会删除表中所有行-- 删除单行DELETEFROMemployeesWHEREemployee_id210;-- 条件删除多行DELETEFROMemployeesWHEREdepartment_id60ANDsalary4000;-- 基于子查询的删除DELETEFROMemployeesWHEREdepartment_idIN(SELECTdepartment_idFROMdepartmentsWHERElocation_id1900);COMMIT;4.2 DELETE vs TRUNCATE的对比特性DELETETRUNCATE语句类型DML可回滚DDL不可回滚是否记录UNDO是每行都记录否只记录页级别操作是否可以加WHERE条件是否触发TRIGGER是否Oracle默认重置AUTO INCREMENT否是重置序列等性能慢大量数据时快几乎瞬间-- TRUNCATE清空表DDL操作立即提交不可回滚TRUNCATETABLEit_employees_backup;-- 立即清空无法回滚-- 对比DELETE ALL可回滚DELETEFROMit_employees_backup;-- DML可以ROLLBACKROLLBACK;-- 还原数据五、MERGE语句UPSERTMERGE是Oracle 9i引入的强大语句可以在单条SQL中实现存在则更新不存在则插入的逻辑即UPSERT。-- MERGE基本语法MERGEINTOtarget_table tUSINGsource_table sON(t.key_columns.key_column)-- 匹配条件WHENMATCHEDTHENUPDATESETt.col1s.col1,t.col2s.col2[DELETEWHERE条件]WHENNOTMATCHEDTHENINSERT(col1,col2)VALUES(s.col1,s.col2);-- 实战示例将临时导入表中的数据同步到正式员工表MERGEINTOemployees tUSINGemployees_import sON(t.employee_ids.employee_id)WHENMATCHEDTHENUPDATESETt.salarys.salary,t.job_ids.job_id,t.last_updateSYSDATEWHEREt.salary!s.salaryORt.job_id!s.job_id-- 只在有变化时更新WHENNOTMATCHEDTHENINSERT(employee_id,first_name,last_name,email,hire_date,job_id,salary,department_id)VALUES(s.employee_id,s.first_name,s.last_name,s.email,NVL(s.hire_date,SYSDATE),s.job_id,s.salary,s.department_id);COMMIT;六、事务控制6.1 事务的ACID特性Oracle通过UNDO表空间、重做日志、锁机制共同保证事务的ACID特性特性说明Oracle实现机制原子性Atomicity事务中的操作要么全部成功要么全部回滚UNDO记录 ROLLBACK机制一致性Consistency事务前后数据库保持一致状态约束检查 UNDO隔离性Isolation并发事务相互隔离互不干扰行级锁 MVCC持久性Durability提交的事务永久保存REDO日志 检查点机制6.2 事务控制语句-- COMMIT提交事务使修改永久生效-- 触发时机-- 1. 显式执行COMMIT-- 2. 执行DDL语句CREATE/ALTER/DROP等会隐式提交-- 3. 正常退出SQL*PlusEXIT/QUIT-- ROLLBACK回滚事务撤销所有未提交的修改-- 触发时机-- 1. 显式执行ROLLBACK-- 2. 异常退出断连、崩溃-- SAVEPOINT在事务中设置保存点可以部分回滚INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary)VALUES(220,Test1,User,TUSER1,SYSDATE,IT_PROG,5000);SAVEPOINTsp1;-- 设置保存点INSERTINTOemployees(employee_id,first_name,last_name,email,hire_date,job_id,salary)VALUES(221,Test2,User,TUSER2,SYSDATE,IT_PROG,5500);SAVEPOINTsp2;-- 设置第二个保存点UPDATEemployeesSETsalary99999WHEREemployee_id220;-- 错误操作ROLLBACKTOSAVEPOINTsp1;-- 回滚到sp1sp1之后的操作全部撤销-- 此时只有员工220还存在且薪资是5000员工221已撤销COMMIT;-- 提交员工220的插入6.3 Oracle的隔离级别Oracle支持两种标准隔离级别默认READ COMMITTED-- 查看当前隔离级别-- Oracle使用MVCC默认隔离级别接近REPEATABLE READ不会出现幻读-- 设置会话隔离级别SETTRANSACTIONISOLATIONLEVELREADCOMMITTED;-- 读已提交默认SETTRANSACTIONISOLATIONLEVELSERIALIZABLE;-- 串行化SETTRANSACTIONREADONLY;-- 只读事务快照读-- Oracle读不阻塞写、写不阻塞读的原因-- 读操作通过UNDO数据读取旧版本数据一致性读不需要加共享锁-- 写操作只锁定被修改的行行级排他锁6.4 行级锁与并发控制-- SELECT FOR UPDATE显式加行锁阻止其他事务修改SELECTemployee_id,salaryFROMemployeesWHEREdepartment_id60FORUPDATE;-- 锁定查询到的所有行直到COMMIT或ROLLBACK-- NOWAIT如果行已被锁定立即报错而非等待SELECTemployee_id,salaryFROMemployeesWHEREemployee_id100FORUPDATENOWAIT;-- WAIT n等待n秒超时则报错SELECTemployee_id,salaryFROMemployeesWHEREemployee_id100FORUPDATEWAIT5;-- SKIP LOCKED跳过已锁定的行适用于并发任务处理SELECTemployee_id,task_statusFROMjob_queueWHEREtask_statusPENDINGFORUPDATESKIP LOCKED;-- 多个进程并发处理队列各自取未锁定的任务七、综合实战案例案例一安全的批量数据更新-- 企业实践分批次更新大量数据避免大事务和锁表-- 每次更新1000行提交后继续下一批DECLAREv_rows_updated NUMBER;v_batch_size NUMBER :1000;BEGINLOOPUPDATEemployeesSETsalarysalary*1.05WHEREdepartment_id60ANDrownumv_batch_sizeANDsalary_updatedN;-- 未处理标志v_rows_updated :SQL%ROWCOUNT;COMMIT;-- 分批提交EXITWHENv_rows_updated0;-- 没有更多行时退出ENDLOOP;DBMS_OUTPUT.PUT_LINE(批量更新完成);END;/案例二完整的业务事务处理-- 模拟员工部门调动的完整事务DECLAREv_emp_id employees.employee_id%TYPE:150;v_new_dept departments.department_id%TYPE:90;v_old_dept departments.department_id%TYPE;v_old_salary employees.salary%TYPE;ex_emp_not_found EXCEPTION;ex_dept_not_found EXCEPTION;BEGIN-- 步骤1查询员工当前信息SELECTdepartment_id,salaryINTOv_old_dept,v_old_salaryFROMemployeesWHEREemployee_idv_emp_id;-- 步骤2验证新部门存在DECLAREv_dummy NUMBER;BEGINSELECT1INTOv_dummyFROMdepartmentsWHEREdepartment_idv_new_dept;EXCEPTIONWHENNO_DATA_FOUNDTHENRAISE ex_dept_not_found;END;-- 步骤3记录调动历史INSERTINTOjob_history(employee_id,start_date,end_date,job_id,department_id)SELECTemployee_id,hire_date,SYSDATE,job_id,department_idFROMemployeesWHEREemployee_idv_emp_id;SAVEPOINTafter_history;-- 步骤4更新员工记录UPDATEemployeesSETdepartment_idv_new_dept,hire_dateSYSDATE-- 更新到新部门的入职日期WHEREemployee_idv_emp_id;-- 步骤5记录操作日志INSERTINTOchange_log(change_time,change_type,description)VALUES(SYSDATE,DEPT_TRANSFER,员工||v_emp_id||从部门||v_old_dept||调至||v_new_dept);COMMIT;DBMS_OUTPUT.PUT_LINE(员工调动事务成功提交);EXCEPTIONWHENNO_DATA_FOUNDTHENROLLBACK;DBMS_OUTPUT.PUT_LINE(错误员工不存在);WHENex_dept_not_foundTHENROLLBACK;DBMS_OUTPUT.PUT_LINE(错误目标部门不存在);WHENOTHERSTHENROLLBACK;DBMS_OUTPUT.PUT_LINE(未知错误||SQLERRM);RAISE;-- 重新抛出异常END;/八、常见问题与陷阱Q1DDL语句为什么会自动提交Oracle中DDL语句CREATE/ALTER/DROP/TRUNCATE等执行前后都会隐式提交当前事务。这意味着-- 危险操作演示INSERTINTOtest_tableVALUES(1,test);-- 未提交的INSERTCREATETABLEanother_test(id NUMBER);-- DDL触发隐式COMMITROLLBACK;-- 已经来不及了INSERT已被提交最佳实践在执行DDL之前确保先COMMIT或ROLLBACK当前事务。Q2UPDATE/DELETE没有WHERE条件怎么办-- 如果误执行了没有WHERE的UPDATE/DELETE-- 方法1立即ROLLBACK如果事务未提交ROLLBACK;-- 方法2使用Flashback Query恢复需要充足的UNDO保留期-- 查看5分钟前的数据状态SELECT*FROMemployeesASOFTIMESTAMP(SYSTIMESTAMP-INTERVAL5MINUTE);-- 使用Flashback恢复表FLASHBACKTABLEemployeesTOTIMESTAMP(SYSTIMESTAMP-INTERVAL5MINUTE);Q3大事务的风险-- 问题一个长时间运行的大事务会占用大量UNDO空间-- 如果UNDO表空间不足会报ORA-01555: snapshot too old-- 解决方案对大批量操作进行分批处理-- 示例分批删除旧数据BEGINLOOPDELETEFROMorder_historyWHEREcreate_dateADD_MONTHS(SYSDATE,-24)ANDROWNUM10000;-- 每批10000行EXITWHENSQL%ROWCOUNT0;COMMIT;ENDLOOP;END;/九、最佳实践及时提交或回滚DML操作后尽快COMMIT或ROLLBACK长时间持锁会影响并发性能避免大事务大批量DML操作应分批进行防止UNDO空间耗尽先SELECT后UPDATE/DELETE修改前先查询确认条件避免误操作使用SAVEPOINT复杂业务逻辑中适时设置SAVEPOINT支持局部回滚注意DDL的隐式提交执行DDL前先处理未完成的DML事务生产环境谨用TRUNCATETRUNCATE不可回滚务必确认后再执行十、总结本文系统讲解了Oracle DML和事务控制的完整体系INSERT单行、多行、子查询INSERT和INSERT ALLUPDATE单列、多列、基于子查询的UPDATEDELETE条件删除及与TRUNCATE的对比MERGEUPSERT语义的实现事务控制COMMIT、ROLLBACK、SAVEPOINT的使用ACID特性Oracle通过UNDO/REDO/锁机制保证事务完整性掌握DML和事务控制是Oracle开发的核心基础技能。下一篇将进入SQL*Plus的学习掌握这个强大的命令行工具的使用技巧。上一篇【第05篇】Oracle子查询与集合操作——嵌套查询与结果合并全解析下一篇【第07篇】SQL*Plus基础——登录、环境设置与缓冲区操作参考资料《Oracle 11g数据库管理员指南》— 刘宪军著Oracle官方文档SQL Language Reference - DML StatementsOracle官方文档SQL Language Reference - Transaction Control

相关文章:

【Oracle数据库指南】第06篇:Oracle DML语句与事务控制——数据操作与ACID特性深度解析

上一篇【第05篇】Oracle子查询与集合操作——嵌套查询与结果合并全解析 下一篇【第07篇】SQL*Plus基础——登录、环境设置与缓冲区操作 摘要 本文全面讲解Oracle DML(数据操作语言)语句,包括INSERT、UPDATE、DELETE和MERGE的详细用法&#x…...

3分钟掌握Windows任务栏投资助手:打造你的桌面股票监控中心

3分钟掌握Windows任务栏投资助手:打造你的桌面股票监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins 想在Windows任务栏上实时监控股票行情,又不想…...

大模型选型生死局(企业CTO私藏对比清单):Claude在长文档法律分析胜出32%,Gemini在实时多跳检索快4.8倍——你的业务该选谁?

更多请点击: https://intelliparadigm.com 第一章:大模型选型生死局:Claude vs Gemini核心能力全景图 在企业级AI应用落地的关键阶段,模型选型已远非单纯比拼参数量或基准分数,而是对推理鲁棒性、上下文工程适配度、多…...

京城汤泉夜宿体验:寻找最舒适的放松之地

引言在快节奏的城市生活中,越来越多的人开始追求一种能够彻底放松身心的方式。洗浴汤泉作为其中的一种选择,以其独特的魅力吸引了众多都市人。本文将带您走进京城的洗浴汤泉世界,特别介绍合韵汤泉,帮助您找到最适合自己的放松之地…...

慕尼黑电子展:洞察汽车电子、工业物联网与功率半导体技术趋势

1. 从慕尼黑看全球电子产业:一场技术与商业的“双向奔赴”又到了双数年的十一月,全球电子工程师和产业领袖的目光,不约而同地再次聚焦于德国慕尼黑。没错,Electronica——这个被誉为全球电子元器件行业“晴雨表”的顶级盛会&#…...

电子仪器CE标志合规:从技术文件到尽职调查的完整指南

1. CE标志合规:从品牌声誉到技术文件的完整闭环在电子设计与制造领域,无论你开发的是精密的数据采集卡、复杂的信号发生器,还是看似简单的万用表,只要你的产品最终要进入欧洲经济区(EEA)市场,CE…...

网安信息收集

声明:任何个人和组织不得从事非法侵入他人网络、干扰他人网络正常功能、窃取网络数据等危害网络安全 的活动;不得提供专门用于从事侵入网络、干扰网络正常功能及防护措施、窃取网络数据等危害网络安全活动的程序、工具;明知他人从事危害网络安…...

从入门到精通:IGV基因组浏览器实战操作全解析

1. IGV基因组浏览器初探 第一次接触IGV(Integrative Genomics Viewer)是在五年前分析RNA-seq数据时,当时被它轻量级的安装包和流畅的基因组导航体验惊艳到了。作为一款由Broad研究所开发的免费工具,IGV完美平衡了专业性和易用性—…...

2026.5.12:三台服务器,一台fastapi的websocket服务接口,一台代理fastapi服务的nginx,一台代理上一个nginx,能穿透websocket吗?

三台服务器,一台fastapi的websocket服务接口,一台代理fastapi服务的nginx,一台代理上一个nginx,能穿透websocket吗? 环境: - 三台服务器 1. 一台fastapi中有websocket接口的服务器:43.226.44.50 2. 一台代理上面1里面的fastapi服务的nginx:43.226.44.184 3. 一台代…...

从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束

从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束 在ZYNQ7000系列开发中,EMIO引脚的正确分配与约束是实现PS与PL协同工作的关键环节。许多工程师在初次接触ZYNQ架构时,往往会被MIO、EMIO和AXI_GPIO的关系所困扰&#xff…...

WarcraftHelper魔兽争霸III优化工具:让你的经典游戏重获新生

WarcraftHelper魔兽争霸III优化工具:让你的经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 你是否还在为《魔兽争霸III》…...

告别TwinCAT:手把手教你用LinuxCNC+IGH搭建开源EtherCAT运动控制平台

告别商业软件束缚:LinuxCNCIGH开源运动控制平台实战指南 在工业自动化和运动控制领域,商业软件长期占据主导地位,但高昂的授权费用和封闭的生态系统让许多工程师和创客望而却步。开源运动控制平台的出现打破了这一局面,为追求灵活…...

告别轮询与中断:用HC32F4A0的AOS+DMA实现多通道ADC的“无感”采集

HC32F4A0的AOSDMA架构:构建零CPU干预的多通道ADC采集系统 在嵌入式数据采集领域,实时性与低功耗始终是工程师需要平衡的核心矛盾。传统基于轮询或中断的ADC采集方案往往面临两大困境:要么因频繁查询浪费CPU资源,要么因中断响应延迟…...

在Node.js后端服务中集成Taotoken调用多模型API实战

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在Node.js后端服务中集成Taotoken调用多模型API实战 构建需要AI能力的Web服务时,后端开发者常面临模型选型、API接入复…...

告别托盘“隐身术”:Total Commander 9.5 最小化任务栏设置详解(附F12配置技巧)

告别托盘“隐身术”:Total Commander 9.5 最小化任务栏设置详解(附F12配置技巧) 第一次打开Total Commander(以下简称TC)时,许多用户会被它的"消失术"困扰——点击窗口右上角的减号按钮后&#x…...

Cursor Pro免费升级完整指南:3分钟突破使用限制的实用教程

Cursor Pro免费升级完整指南:3分钟突破使用限制的实用教程 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your…...

氛围编程实战:用AI工具栈快速构建可部署应用

1. 项目概述:什么是“氛围编程”?如果你对“氛围编程”这个词感到陌生,或者觉得它听起来有点玄乎,那太正常了。我第一次听到时,也以为又是哪个硅谷弄潮儿发明的新潮黑话。但当我真正开始实践,并在几个月内从…...

流处理优化:提高实时数据处理性能

流处理优化:提高实时数据处理性能 一、流处理优化概述 1.1 流处理优化的定义 流处理优化是指通过优化流处理系统的性能、吞吐量和延迟,提高实时数据处理能力的过程。它涉及优化数据处理管道、资源配置和算法实现。 1.2 流处理优化的价值 低延迟&#xff…...

避坑指南:海康威视工业相机SDK二次开发常见问题排查(从环境配置到图像采集)

海康威视工业相机SDK开发实战:从环境搭建到图像处理的深度避坑指南 工业视觉领域的开发者们,是否曾在深夜调试海康威视相机SDK时,被突如其来的"DLL缺失"错误打断思路?或是明明按照文档配置了项目属性,却始终…...

TextInputLayout实战:从属性解析到自定义样式进阶

1. TextInputLayout基础入门:从零开始掌握Material输入框 第一次接触TextInputLayout时,我被它丝滑的浮动提示动画惊艳到了。相比传统的EditText,这个Material Design组件确实能让表单界面瞬间提升好几个档次。记得去年做登录页面重构时&…...

LeetCode 岛屿数量题解

LeetCode 岛屿数量题解 题目描述 给定一个二维网格地图 1(陆地)和 0(水),计算岛屿的数量。 示例: 输入:grid [ ["1","1","1","1","0"], …...

基于WebSocket的Web即时通讯后端架构设计与实战部署指南

1. 项目概述:一个面向开发者的Web即时通讯解决方案最近在折腾一个内部协作工具,需要集成一个稳定、可控且能深度定制的即时通讯模块。市面上成熟的IM SDK很多,但要么是黑盒,出了问题排查困难;要么是功能臃肿&#xff0…...

3步在Windows上安装APK应用:告别安卓模拟器的轻量级解决方案

3步在Windows上安装APK应用:告别安卓模拟器的轻量级解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想在Windows电脑上直接运行Android应用却不想安…...

【Nature期刊精准捕获术】:基于Perplexity语义图谱的跨学科文献溯源方法论(附2024最新验证数据集)

更多请点击: https://intelliparadigm.com 第一章:【Nature期刊精准捕获术】:基于Perplexity语义图谱的跨学科文献溯源方法论(附2024最新验证数据集) 传统关键词检索在跨学科高影响力期刊(如 Nature、Scie…...

避坑指南:SciencePlots安装后样式不生效?手把手教你排查Matplotlib的stylelib路径问题

科学绘图样式失效?彻底解决Matplotlib样式库路径配置难题 当你第一次尝试用SciencePlats的science样式美化科研图表时,却发现Python报出KeyError: science is not a valid style的错误提示——这种挫败感我深有体会。作为每天与数据可视化打交道的从业者…...

YOLO26改进 | MSHC多尺度异构卷积:用方形核与条带核捕获复杂空间纹理,以清晰动机打造超强创新!

# YOLO26改进最新创新改进系列 | MSHC多尺度异构卷积:用方形核与条带核捕获复杂空间纹理,以清晰动机打造超强创新! 购买相关资料后畅享一对一答疑! 畅享超多免费持续更新且可大幅度提升文章档次的纯干货工具! 这篇采用…...

用Python和MATLAB复现DMD算法:从COVID-19死亡数据预测到动态模态分解实战

用Python和MATLAB复现DMD算法:从COVID-19死亡数据预测到动态模态分解实战 动态模态分解(Dynamic Mode Decomposition, DMD)作为一种数据驱动的建模方法,近年来在复杂系统分析、流体力学和流行病预测等领域展现出强大潜力。本文将带…...

如何快速搭建AI聊天前端:SillyTavern完整教程与角色扮演系统指南

如何快速搭建AI聊天前端:SillyTavern完整教程与角色扮演系统指南 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 想象一下,你能够与任何AI角色进行沉浸式对话&#…...

紧急预警:Midjourney即将下架Nihonga相关风格标签?(内部消息+已存档的5类不可再生提示词组合,仅限今日开放获取)

更多请点击: https://intelliparadigm.com 第一章:Nihonga风格在Midjourney中的历史定位与美学内核 Nihonga(日本画)作为明治维新后确立的现代民族绘画体系,以天然矿物颜料、金箔银箔、胶质媒介及传统和纸为物质基础&…...

手把手教你ClickHouse(二、Windows下Docker部署与可视化实战)

1. Windows下Docker环境准备 在开始部署ClickHouse之前,我们需要先确保Windows系统已经正确配置Docker环境。这里我推荐使用Docker Desktop for Windows,它提供了图形化界面和完整的容器管理功能。安装过程可能会遇到几个常见坑点,我把自己实…...