本部落格記錄一下一次踩坑記錄,過程是這樣的,在跟乙個bug,涉及到一張中間表,然後這張中間表的主鍵是自增的,不過因為對接其它系統,出現了主鍵唯一性衝突,所以我就只好改資料了,思路是想查最大值,然後修改資料。原本認為既然是一張中間表,那我不改關聯表就好,我改中間表的主鍵應該不會影響系統。不料還是出現了資料問題了。
查詢這張中間表的主鍵的最大值時,我並沒有注意到是varchar型別的,以為是number型別的,資料庫採用oracle。ps:oracle並沒有int型別,這點和mysql不一樣。
查詢到間表的id最大的值,很自然的,就敲條sql
select max(id) from table a;
這條sql就得到最大值,看起來很正常,不過我並沒有注意到這個id是varchar型別,所以開發過程,需要仔細一點,雖然我們都知道這個道理,不過在專案很趕,或者狀態不好的情況,還是很多人不仔細,所以我還是記錄一下,僅僅是作為個人的筆記記錄一下而已,然後僅僅是參考,希望能給別人一些啟發。
我查出的最大值是9999,不過偶然發現,竟然有個10000+的數值,這樣我就納悶了。所以,這裡說一下,這個id是字串型別的,字串型別的排序和number型別的排序是不一樣的,oracle字串比較大小是根據ascii來的,字串排序是先比較第乙個字元,eg:這裡列舉"9"和"10"的列子,這裡的"9"和"10"都是字串型別的,比較過程是這樣的,先從第乙個字元比較,'9』比』1』大,所以,"9"排在前面,"10"排在後面。ps:字串比較就是這樣根據ascii來,先比較第乙個字元,如果相等,在比較第二個字元,以此類推…
所以sql:select max(id) from table a;就會出現"9"比"10"大的情況,這裡的id是字串型別。
要得出正確的情況:在oracle裡就要用sql:
select max(to_number(id)) from table a;
然後我在改資料的過程出現了問題,然後幸好有公司導師相助,得到了一條資料庫回滾的sql,所以還是學到了。下面給出sql,希望可以幫助學習的人
【表資料恢復回n分鐘之前】
alter table 表名 enable row movement;
flashback table 表名 to timestamp systimestamp - interval 'n' minute;
字串之排序
題目 小q最近遇到了乙個難題 把乙個字串的大寫字母放到字串的後面,各個字元的相對位置不變,且不能申請額外的空間。你能幫幫小q嗎?例如 4khao8ing0eil3u 轉換後 khaoingeilu4803public static void main string args private stat...
oracle之字串拆分
create table zylemp ename varchar2 50 insert into zylemp values 中國 insert into zylemp values 中國 湖北 insert into zylemp values 中國 湖北 黃岡 insert into zyle...
字串 字串排序
頻率統計 將頻率轉換為索引 資料分類 回寫頻率統計 統計每個字元出現的次數 將頻率轉換為索引 確定不同字元首位置 從右到左檢查檢查鍵中的字元 public class lsd public class msd public static void sort string a private stat...