在大部分 SQL 資料庫中,如果您在資料表上有一個 UNIQUE、NOT NULL 或 CHECK 約束,而您嘗試執行違反約束的 UPDATE 或 INSERT,資料庫將中止進行中的操作,撤銷與相同 UPDATE 或 INSERT 陳述式相關的任何先前變更,並傳回錯誤。這是 SQLite 的預設行為,儘管 SQLite 也允許定義處理約束衝突的替代方式。本文說明這些替代方式以及如何使用它們。
SQLite 定義了五種衝突解決演算法,如下所示
當發生約束衝突時,會立即執行 ROLLBACK,從而結束目前的交易,而指令會中斷並傳回 SQLITE_CONSTRAINT 回應碼。如果沒有交易處於作用中(除了在每個指令上建立的暗示交易之外),則此演算法的作用與 ABORT 相同。
當發生約束衝突時,指令會撤銷它可能已做出的任何先前變更,並中斷並傳回 SQLITE_CONSTRAINT 回應碼。但不會執行 ROLLBACK,因此會保留相同交易中先前指令的變更。這是 SQLite 的預設行為。
當發生約束違反時,指令會中止並傳回代碼 SQLITE_CONSTRAINT。但指令在遭遇約束違反之前對資料庫所做的任何變更都會保留,且不會備份。例如,如果 UPDATE 指令在嘗試更新的第 100 列中遇到約束違反,則前 99 列變更會保留,但第 100 列及以後的變更則不會發生。
當發生約束違反時,包含約束違反的那一列不會插入或變更。但指令會繼續正常執行。包含約束違反的那一列前後的其他列會繼續正常插入或更新。不會傳回錯誤。
當發生 UNIQUE 約束違反時,會在插入或更新目前列之前移除造成約束違反的先前列。因此,插入或更新總是會發生。指令會繼續正常執行。不會傳回錯誤。
此頁面最後修改於 2022-01-08 05:02:57 UTC