<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

    蜜果私塾:常用數據庫的DML語句的比較和總結

    文:阿蜜果

    日期:2011-8-6

    版權所有,轉載請注明出處

    DML = Data Manipulation Language,數據操縱語言,使用戶能夠查詢數據庫以及操作已有數據庫中的數據的計算機語言。具體是指是UPDATE更新、INSERT插入、DELETE刪除。

    最近為了做新舊系統異構數據庫的同步,另外為了確保新舊系統實現的業務功能更加趨于一致,所以有點小懶的我也啃了一段時間的舊系統的存儲過程(舊系統的業務功能全部依賴SQL Server中的存儲過程,而新系統采用Oracle數據庫, 而且數據庫語句都通過上層的業務編寫),對一些DML語句有一些總結和體會,分享給大家。

    本文進行對比的地方基于常用的幾種數據庫:Oracle、MySQLSQL Server。

    1、 盡量避免不夠通用的SQL語句

    有一些語句寫法只在某一種數據庫中使用,而其余數據庫會導致執行失敗,若需要在編程時寫SQL語句,因為可能引起的數據庫遷移問題,何不盡量避免這種遷移陷阱呢?

    1INSERT后不加INTO

           INSERT后不加INTO,在SQL ServerMySQL數據庫都會執行成功,但Oracle會提示“ORA-00925: missing INTO keyword”的錯誤信息,例如:

    INSERT userbarring(UserName, PhoneNumber, Areanum, LimitType) VALUES ('amigo''13233334444''010'1);

    2DELETE后不加FROM

           DELETE后不加FROM的情況,在SQL ServerOracle數據庫中可以執行成功,但在MySQL數據庫中會提示“SQL 執行錯誤 # 1064. 從數據庫的響應: You have an error in your SQL syntax; check the manual that corresponds to you’re my SQL server version from the right syntax to use near ‘…….’”,例如:

    DELETE cld_callbarring WHERE UserName='amigo'

    3)獲取當前時間

            這三種數據庫的都能定義DATETIME(日期時間類型),但在INSERTUPDATE等語句為這種類型的數據設值時所用的函數都各不相同。MySQL使用now()函數,SQL Server使用GETDATE()函數,Oracle使用sysdate。

    例如在MySQL中顯示當前時間可使用語句:

    select now()

    Oracle中顯示當前時間使用語句:

    select sysdate from dual

    為了解決三者使用不一樣的問題,一般的做法是在Java使用JDBC操作時,可以將當前時間通過Java的方法得到,再給某個字段設置這個java.sql.Date類型的值,參考代碼如下:

    Date createTime = new Date();
    String sql 
    = "insert into testdate(createTime) values (?) ";
    ps 
    = conn.prepareStatement(sql);
    ps.setDate(
    1new java.sql.Date(createTime.getTime()));
    int re = ps.executeUpdate();

    4)自增主鍵的處理

           在這三種數據庫中都可以定義自增ID作為主鍵,優點:節省時間,根本不用考慮怎么來標識唯一記錄,寫程序也簡單了,數據庫維護著這一批ID號,在INSERT語句時,如果所操作的表采用了自增主鍵,一般不需要指定這個字段。

      缺點:在做分布式數據庫時,要求數據同步時,這種自增ID就會出現嚴重的問題,因為你無法用該ID來唯一標識記錄。同時在數據庫做移植時,也會出現各種問題,總之,對此自增ID有依賴的情況,都有可能出現問題。我就是深受其害的人之一。

          解決的方法有很多,例如將主鍵定義成一個字符串類型,該字段交給上層業務來指定和保證唯一性,例如定義成流水號(里面帶有日期時間和其它保證唯一性的值)。或者將主鍵使用uniqueidentifier數據類型等。

    2、 稍微復雜點的DML語句

    1INSERT語句中各字段的值來自SELECT語句

         INSERT語句用于向表格中插入新的行,若按照數據庫字段的排列順序進行字段設值,可以在INSERT語句中不指定字段名稱,參考語法如下:

    INSERT INTO 表名稱 VALUES (1, 2,....)

    因為上面的語句太依賴于字段的排序,為了導致遷移的一些不必要的問題,一般提倡指定所要插入數據的列,參考語法如下:

    INSERT INTO表名稱 (1, 2,...) VALUES (1, 2,....)

    INSERT語句新行數據的全部字段的值或某些字段的值可以來自于對另一個表的查詢語句。例如如下的語句將userbarring中的LimitType值為0的記錄插入到userbarring_bak表中:

    INSERT INTO userbarring_bak(UserName, PhoneNumber, Areanum, LimitType) SELECT Usernumber, BarNumber, Areanum, LimitType FROM userbarring where LimitType=0

    2CASE……WHEN……語句

    有些INSERTUPDATE語句中帶有CASE……WHEN語句,舉例如下:

    INSERT INTO PLAT_UIDLine(UID,CallIn,CallOut,LastUpdateTime) VALUES (‘12345678’,(CASE @CallType WHEN 1 THEN 1 ELSE 0 END),(CASE @CallType WHEN 2 THEN 1 ELSE 0 END),GETDATE())

    其中CallType變量是存儲過程定義的,在運行時它是確定的值。

    待續。

    3、 參考文檔

    uniqueidentifier數據類型》:http://baike.baidu.com/view/1440863.htm

    posted on 2011-08-06 16:31 阿蜜果 閱讀(2356) 評論(0)  編輯  收藏 所屬分類: database
    <2011年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294512
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 24小时日本电影免费看| 99视频在线精品免费| 午夜无遮挡羞羞漫画免费| 91亚洲一区二区在线观看不卡 | 亚洲精品tv久久久久| 另类专区另类专区亚洲| 国产jizzjizz视频免费看| 中文字幕免费观看全部电影| 亚洲中文字幕伊人久久无码| 全部一级一级毛片免费看| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲国产成人AV在线播放| 一区二区免费电影| 91情侣在线精品国产免费| 中文字幕亚洲综合小综合在线| 99在线视频免费观看视频| 亚洲乱码国产乱码精华| 又粗又硬又黄又爽的免费视频 | 久久久久亚洲精品无码系列| 亚洲人成电影网站色www| 日韩一级在线播放免费观看| 亚洲欧洲国产成人精品| 国产黄在线播放免费观看| 亚洲s色大片在线观看| 国产免费丝袜调教视频| 亚洲欧美国产国产综合一区| 免费国产高清视频| 精品免费视在线观看| 亚洲人成免费电影| 四虎AV永久在线精品免费观看| 三年片免费观看大全国语| 亚洲国产精品成人精品小说| 国产美女无遮挡免费视频网站| 成人片黄网站色大片免费观看cn| 亚洲伊人tv综合网色| 国产美女精品视频免费观看 | 亚洲成av人在片观看| 99国产精品免费观看视频| 亚洲Av无码国产一区二区| 亚洲va久久久噜噜噜久久| 麻豆精品国产免费观看|