我知道SQL約束可以強制數據滿足有效性標準。然而,關於「學生等級」這樣的標準,只有在「最終確定」標誌爲假時才能更新?這樣的更新標準是否必須由應用程序來處理?當條件成立時,是否可以使用SQL約束來防止特定值發生更改?
回答
簡答:不,SQL約束本身無法阻止當Finalized爲'true'(但允許進行其他更改)時更改列等級。
有several kinds of SQL constraints:CHECK,DEFAULT,NOT NULL,UNIQUE,主鍵和外鍵。
這些都可以單獨或組合地限制或影響列的值,但不能阻止對允許的值進行UPDATE。特別是,這些約束條件都不能阻止基於以前的Grade和Finalized值更新爲Grade和/或Finalized。
UPDATE觸發器可以執行此操作:比較Grade的新值和舊值,如果這些值不同並且Finalized ='true',則回滾UPDATE並附帶說明性錯誤消息。
但是,應用程序可以並且應該更加優雅地執行這樣的「業務規則」。規則本身可以稍微澄清一下關於Finalized值何時可以改變的說明。例如。,是否允許更改等級並同時設置Finalized ='false'?觸發器邏輯可以處理這些細節,並且將它作爲故障安全來安裝是合理的,同時使規則在應用程序的某處(前端/中間件/後端)也是明確的。
IMO,我會說它應該在應用程序或存儲過程(可能兩者),而不是作爲一個實際的約束(除其他外,在你的具體例子中,一個等級被「最終確定」永遠不會意味着它實際上是最終的)。
但是,如果我實現這個作爲一個約束,我會使用一個CHECK約束(再次使用你的例子)
CONSTRAINT chk_grade CHECK(grade between 0 AND 100 and finalized = 0)
檢查,具體的語法,但它是在那裏我開始。
觸發器,約束和附加列。
從端部開始:
附加列存儲要被 '固定' 的值:
ALTER TABLE ADD SavedGrade int
約束限制了
Grade
列的變化:ALTER TABLE Students ADD CONSTRAINT CK_Grade CHECK (Finalised = 'false' OR Grade = SavedGrade)
觸發器更新附加公司lumn當
Grade
列被更新(以下是SQL Server):CREATE TRIGGER StudentsFinaliseGrade ON Students AFTER INSERT, UPDATE AS IF UPDATE(Grade) UPDATE Students SET SavedGrade = i.Grade FROM inserted i WHERE i.ID = Students.ID AND i.Grade <> i.SavedGrade
所以,只要Finalised = 'false'
,該Grade
列可以被改變。當它更改爲時,該值立即存儲到SavedGrade
列中。 (我們正在更新SavedGrade
,因爲否則約束將不允許我們將Finalised
設置爲'true'
。)只要設置了Finalised
,由於約束,您不能再更改Grade
列。
- 1. 是否可以使用CHECK約束來防止重新分配列值?
- 2. 當修改UIViewController時,約束條件發生了變化。框架
- 3. 當SelectList更新爲新值時,jQuery防止發生更改
- 4. 添加約束以防止SQL更新中的重複觸發
- 5. 當模型更新時,我是否可以防止/延遲AngularJS $摘要發生
- 6. Oracle SQL - 僅當特定條件成立時纔可以連接兩個表?
- 7. 更改約束條件
- 8. 隨機生成約束條件以生成約束Delaunay三角剖分
- 9. 是否可以防止在wordpress中更新特定的metafield?
- 10. 是否可以綁定RelativeLayout約束?
- 11. 使用外鍵約束來防止更新父行
- 12. 如何在sql上使用條件來查找以特定值結束的varchar?
- 13. SQL動態刪除MySQL列約束,以防止柱更新
- 14. 防止根據先前值更新列的SQL約束
- 15. 是否可以防止DLL被修改?
- 16. 是否可以使用成員約束進行類型縮寫?
- 17. 如果公式更改,我是否可以防止計算列更改其值?
- 18. SQL服務器 - 約束,以防止在同一時間
- 19. 使用特性更改約束乘數
- 20. 是否可以爲特定方法約束泛型類?
- 21. 在SQLite中創建後是否可以更改列約束?
- 22. 是否可以輸出'rake db:migrate'生成的SQL更改腳本?
- 23. 當$ ionicView.beforeLeave事件觸發時,您是否可以停止在離子中發生的視圖更改?
- 24. 是否可以使用JPA定義異或約束?
- 25. 防止會話結束時webroot更改
- 26. 特定範圍的Pyomo約束條件
- 27. 是否可以使用SQL Server審覈審覈更改的值?
- 28. 是否可以在預生成事件中更改文件的生成操作?
- 29. postgresql外鍵約束,以防止重複
- 30. 生成的SQL中的奇怪約束條件
根據您的RDBMS,您可以在表格上使用「before」或「instead of」觸發器來強制執行此操作。 –
喬說什麼,儘管也可以使用檢查約束,這取決於數據庫。 – Oded