程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL語句操作主從關系表

SQL語句操作主從關系表

編輯:關於SqlServer

在項目開發中,經常出現這樣的需求。在新增或修改一個主表數據時,對應的從表也要進行同步,此時我們是怎麼操作的了?典型的方法就是對於主表的各數 據字段進行更新或新增,對於從表一般都會先刪除相關的所有記錄,然後再進行插入。也就是說每次保存時,從表的數據都要重新執行一遍刪除再插入的過程。這是 一個不錯的方法,在使用數據庫事務後,不會存在刪除後又沒有插入導致數據不一致的情況。

ok,原理是這樣,那麼到實際的操作中,大家如何操作的呢?有人通過在程序中,通過多次數據庫操作完成如上的要求,這種方法可能存在這數據的不一致 性,因為無法保證在兩個數據語句操作之間出現意外。那麼我們就合並到一個存儲過程中去完成吧,復雜的參數和接收後處理,讓這個存儲過程變的困難。下邊我就 結合實際應用說說此過程吧。應用場景,在學生管理中,添加一條學生記錄,對應的要 添加學生對應的課程。即每次更新和新增學生記錄,對應其課程也要跟著變化。

那麼這個過程,就符合上邊的邏輯。

通用的參數傳遞,在此不再詳說,重點講解,科目信息傳遞過後怎麼處理。假設從表Tb_StudentSubject 存在StudentId,SubjectId兩個字段。那麼代碼如下:

  1. Create proc SaveInfo
  2. (
  3. ---參數列表不再逐一書寫
  4. @subjectList varchar(400))
  5. as
  6. begin tran
  7. --新增或修改主表 省略
  8. DECLARE @subjectID int,
  9. @subjectIDsLen int,--科目長度
  10. @subjectIDLen int,--單個科目長度
  11. @nStart INT , -- 記錄查找的起始位置
  12. @nLast INT -- 記錄‘,’的位置
  13. select @subjectIDsLen=len(@SubjectIDs),@nStart=1,@nLast=0
  14. DELETE Tb_StudentSubject WHERE StudentId=@sId --刪除相關的全部記錄
  15. IF(@subjectIDsLen>0)
  16. BEGIN
  17. while(@nStart<@subjectIDsLen)
  18. BEGIN
  19. set @nLast=charindex(',',@SubjectIDs,@nStart)--從第@nStart個位置開始記錄逗號的位置
  20. set @subjectIDLen=@nLast-@nStart --記錄每個subjectID的長度
  21. set @subjectID=substring(@SubjectIDs,@nStart,@subjectIDLen)--獲取一個subjectID
  22. Insert Into Tb_StudentSubject(StudentId,SubjectID)values(@sId,@subjectID)
  23. set @nStart=@nLast+1--設置下次查找的起始位置
  24. END
  25. END
  26. if @@Error=0
  27. commit transaction
  28. else
  29. rollback transaction
  30. End

在這邊代碼中,科目列表通過“,”進行分割,上邊的存儲過程帶注釋,重點說明兩個系統自帶的函數

CHARINDEX ( expression1 ,expression2 [ , start_location ] )

expression1 :其中包含要查找的字符的序列

expression2 :通常是一個為指定序列搜索的列

start_location :開始在 expression2 中搜索 expression1 時的字符位置。如果 start_location 未被指定、是一個負數或零

另一個函數就是:SUBSTRING ( expression ,start , length )從指定的數據源串中從指定位置截取指定長度的串

其中 expression :是字符串、二進制字符串,要操作的數據源串

start:要截取的開始位置,注意此方法和C#自帶的位置不一樣,數據庫中strat從1開始,程序中從0開始

length:截取內容的長度

另外一個就len(expres) 這個就比較簡單了,獲取指定字符的長度

通過以上代碼,就可以實現一個完整存儲過程實現主從表數據的處理了,在數據一致性和操作便捷性得到保證,而且相同通用。

注:在涉及類似主從關系表中,建議不要在從表中設置自動編號的主鍵,因為頻繁的刪除和添加,導致主鍵不斷的累增,而且毫無使用此主鍵的意義。

以上內容是個人見解,希望大家多交流相應的方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved