SQL Server column not allow Null,insert failed

這個是一個Vendor的應用程序報的錯誤。,單看這個錯誤原因很簡單,嘗試將NULL值插入到表,但是表不允許使用NULL值。

 

查到後面發現其實根本原因是字段的內容沒有按照當時的規定。按照要求,用戶輸入的需要包含’-’,但是用戶輸入的數據沒有這個字符,系統嘗試用”-”分隔數據的時候出現問題。

 

其實這個是應用程序設計的問題,在用戶輸入的時候根據規則驗證用戶的輸入,確保所有的數據都是合理的,這樣可以避免後續的問題。(如果不做驗證的話,除了業務邏輯的問題,還可能會導致SQL注入的問題)。

 

解決思路:除了在應用端做驗證,也可以用SQLServer Constraint

 

下面舉個例子:

 

createtable test(namevarchar(10))

 

altertable testaddconstraintck_nameCHECK(charindex('-',name)>0)

 

如果我嘗試插入沒有”-”字符的數據會出現下面的錯誤:

 

insertinto testvalues ('4')

 

Msg 547, Level16, State 0, Line 1

The INSERTstatement conflicted with the CHECK constraint "ck_name". Theconflict occurred in database "master", table "dbo.test",column 'name'.

The statement has beenterminated.



 

有一點要注意保持事物的完整性,如果一次插入多條記錄,不用顯示事物的話可能會出現有些插入成功,有些失敗的情況。爲了保持完整性,可以用顯事物:

 

begintry

begintran

insertinto test values ('1-')

insertinto test values ('2-')

insertinto test values ('3-')

insertinto test values ('4')

insertinto test values ('5-')

committran

endtry

begincatch

rollbacktran

endcatch

 

這樣如果有一條記錄有問題就會回滾整個事務。Constraint還可以限制唯一值,外鍵,用正則表達式等,功能非常強大,數據輸入的時候做好驗證,可以避免後續很多的維護問題。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章