故事是这样开始的
在一个月黑风高的夜晚
现场报过来,本该打到新服务的流量,又走到了老服务,老服务的功能不健全,很可能会让现场的用户不能支付。 需要说明一点的是,任何一个从老服务改造到新服务的时候,都不是完全把流量切过去,都需要经过一点时间去验证。
比如我们按照地理位置去切,将北京的部分车场(是的,我们是做停车服务的),切到新服务,其他城市的车场在老服务
我们采用最简单的办法,就是靠一个字段type去控制(0和1)
看似简单,但是事怪就怪在这个字段上,这个控制字段是属于后来加到数据库字段的,而且没有对外去配置,都是通过运维手动去数据库配置的,且数据库字段默认值设置为1。
可总有几个车场时不时的从0就变成了1。。众所周知,一个新的字段不在mybatis xml和pojo出现,那么就不会有操作改掉
翻遍所有的服务,关乎这个表的都是update操作,update操作因为没有这个字段时打死也不会改这个type的
冷静下来想想,数据库默认字段为1,然后0都会变成1。没有1变成0的,可以肯定的是,先删除,又新增了,否则没有别的解释
经过一番查验,找到这样一堆代码(伪代码)
replace INTO `A` ( park_id, xxxx, xxxx ) SELECT park_id, xxxx, xxxx FROM B where b.park_id = #{parkId}复制代码
看到这里,心里嘿嘿一笑,破案了。。。。。
replace INTO
是的,就是replace INTO搞得鬼,大家都知道,replace INTO和insert into的区别
1、replace into 首先尝试插入数据到表中, 如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
2、如果表中无此数据,则插入新数据。
这就正好验证了上面的猜想,只有删除再添加,才会让type跟随数据库的默认值走
讲到这里不妨我们多了解一点这个,有人可能会问,replace是不是取代了insert和delete,毕竟是干了两件事
MySql手册关于replace into的算法:Mysql手册
MySQL uses the following algorithm for REPLACE (and LOAD DATA ... REPLACE):Try to insert the new row into the tableWhile the insertion fails because a duplicate-key error occurs for a primary key or unique index:Delete from the table the conflicting row that has the duplicate key valueTry again to insert the new row into the tableMySQL对REPLACE(和LOAD DATA…REPLACE)使用以下算法: 尝试将新行插入表中 当由于主键或唯一索引出现重复键错误而导致插入失败时: 从表中删除具有重复键值的冲突行 再次尝试将新行插入表中复制代码
先插入, 出错了再执行delete加insert. 如果自己用程序来做, 个人认为效率会低很多,另外这样写真的很搞人
这里推荐使用INSERT...ON DUPLICATE KEY UPDATE, 感觉很靠谱. replace的副作用:
replace每次要重新分配自增id;
replace中执行delete时, 在有外键的情况下会很麻烦;
如果delete时定义的有触发器, 则会被执行;
副作用也会被传播到replica slave
总结
开发当中难免遇到奇奇怪怪的各种问题,有问题莫慌,冷静分析,你认为的不可能事件、你认为的计算机会发生错误,其实都是自己没有去完全理解到位,跟踪到位!!!【推荐学习:MySQL视频教程、SQL视频教程】
最后祝大家2023,少写bug,少加班,多涨薪
以上是因为一条sql语句产生了自我怀疑!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

SQL與數據庫的關係是緊密結合的,SQL是管理和操作數據庫的工具。 1.SQL是一種聲明式語言,用於數據定義、操作、查詢和控制。 2.數據庫引擎解析SQL語句並執行查詢計劃。 3.基本用法包括創建表、插入和查詢數據。 4.高級用法涉及復雜查詢和子查詢。 5.常見錯誤包括語法、邏輯和性能問題,可通過語法檢查和EXPLAIN命令調試。 6.優化技巧包括使用索引、避免全表掃描和優化查詢。

SQL是一種用於管理關係數據庫的標準語言,而MySQL是一個使用SQL的數據庫管理系統。 SQL定義了與數據庫交互的方式,包括CRUD操作,而MySQL實現了SQL標準並提供了額外的功能,如存儲過程和触發器。

SQL在數據管理中的作用是通過查詢、插入、更新和刪除操作來高效處理和分析數據。 1.SQL是一種聲明式語言,允許用戶以結構化方式與數據庫對話。 2.使用示例包括基本的SELECT查詢和高級的JOIN操作。 3.常見錯誤如忘記WHERE子句或誤用JOIN,可通過EXPLAIN命令調試。 4.性能優化涉及使用索引和遵循最佳實踐如代碼可讀性和可維護性。

SQL是一種用於管理和操作關係數據庫的語言。 1.創建表:使用CREATETABLE語句,如CREATETABLEusers(idINTPRIMARYKEY,nameVARCHAR(100),emailVARCHAR(100));2.插入、更新、刪除數據:使用INSERTINTO、UPDATE、DELETE語句,如INSERTINTOusers(id,name,email)VALUES(1,'JohnDoe','john@example.com');3.查詢數據:使用SELECT語句,如SELEC

SQL和MySQL的關係是:SQL是用於管理和操作數據庫的語言,而MySQL是支持SQL的數據庫管理系統。 1.SQL允許進行數據的CRUD操作和高級查詢。 2.MySQL提供索引、事務和鎖機制來提升性能和安全性。 3.優化MySQL性能需關注查詢優化、數據庫設計和監控維護。

SQL用於數據庫管理和數據操作,核心功能包括CRUD操作、複雜查詢和優化策略。 1)CRUD操作:使用INSERTINTO創建數據,SELECT讀取數據,UPDATE更新數據,DELETE刪除數據。 2)複雜查詢:通過GROUPBY和HAVING子句處理複雜數據。 3)優化策略:使用索引、避免全表掃描、優化JOIN操作和分頁查詢來提升性能。

SQL適合初學者,因為它語法簡單,功能強大,廣泛應用於數據庫系統。 1.SQL用於管理關係數據庫,通過表格組織數據。 2.基本操作包括創建、插入、查詢、更新和刪除數據。 3.高級用法如JOIN、子查詢和窗口函數增強數據分析能力。 4.常見錯誤包括語法、邏輯和性能問題,可通過檢查和優化解決。 5.性能優化建議包括使用索引、避免SELECT*、使用EXPLAIN分析查詢、規範化數據庫和提高代碼可讀性。

SQL在實際應用中主要用於數據查詢與分析、數據整合與報告、數據清洗與預處理、高級用法與優化以及處理複雜查詢和避免常見錯誤。 1)數據查詢與分析可用於找出銷售量最高的產品;2)數據整合與報告通過JOIN操作生成客戶購買報告;3)數據清洗與預處理可刪除異常年齡記錄;4)高級用法與優化包括使用窗口函數和創建索引;5)處理複雜查詢可使用CTE和JOIN,避免常見錯誤如SQL注入。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器