Sql-Server

在 SQL Server 中,檢查約束是在插入的預設約束之前還是之後應用的?

  • December 15, 2016

根據標題:在 SQL Server 中,檢查約束是在插入的預設約束之前還是之後應用的?

所以採取下表(為簡潔起見省略了不必要的列)……

CREATE TABLE [dbo].[Customer](
   [CountryCode] [varchar](5) NULL CONSTRAINT [CK_Customer_DefaultCountryCode]  DEFAULT ([app].[GetUnknownCountryIsoCountryCode]()),
) ON [PRIMARY]

…它還具有以下檢查約束…

ALTER TABLE [admin].[Customer]  WITH CHECK 
   ADD  CONSTRAINT [CK_CustomerHasCountryWhenIntercompanyBusinessModel] 
   CHECK  (
       ([app].[BusinessModelMustHaveCountry]([BusinessModelId]) = (1) AND [app].[CheckCountryCodeExists]([CountryCode]) = (1) OR 
       [app].[BusinessModelMustHaveCountry]([BusinessModelId]) <> (1))
   )
GO

…是否會在應用檢查約束之前應用預設約束並填充預設值?

之後應用檢查約束。

您可以從以下成功的事實中看出這一點。

DECLARE @T TABLE(X INT DEFAULT 1 CHECK (X = 1)); 

INSERT @T DEFAULT VALUES;

此外,執行計劃顯示斷言運算符對錶插入運算符的輸出值進行操作,因此正在檢查實際插入的值。

在此處輸入圖像描述

引用自:https://dba.stackexchange.com/questions/158247