默认约束未强制执行

时间:2017-04-05 21:37:40

标签: tsql

鉴于以下表格定义:

CREATE TABLE ControlledSubstances.NationalDrugCode
(
    NationalDrugCodeID INT NOT NULL
    ,NationalDrugCode VARCHAR(20) NOT NULL
    ,Product VARCHAR(100)
    ,Ingredient VARCHAR(500)
    ,ClassID VARCHAR(50)
    ,Class VARCHAR(50)
    ,DrugEnforcementAgencyClassID VARCHAR(50)
    ,DrugEnforcementAgencyClass VARCHAR(50)
    ,GenericDrug VARCHAR(50)
    ,Form VARCHAR(50)
    ,Drug VARCHAR(50)
    ,StrengthPerUnit NUMERIC(6,2)
    ,UnitOfMeasure VARCHAR(50)
    ,ConversionFactor NUMERIC(4,2)
    ,LongOrShortActing VARCHAR(50)
    ,IsPreventionForStates BIT NOT NULL
)
;

ALTER TABLE ControlledSubstances.NationalDrugCode
    ADD CONSTRAINT PK_ControlledSubstances_NationalDrugCode PRIMARY KEY (NationalDrugCodeID)
        ,CONSTRAINT DF_ControlledSubstances_NationalDrugCode_IsPreventionForStates DEFAULT 0 FOR IsPreventionForStates
;

CREATE UNIQUE INDEX UQ_ControlledSubstances_NationalDrugCode_NationalDrugCode ON ControlledSubstances.NationalDrugCode (NationalDrugCode);

为什么我在插入列表时收到错误,我将其定义为NOT NULL并创建了默认约束0?我知道我可以处理insert语句中的逻辑以不传递NULL值,但我在多个表中使用此逻辑并且之前从未遇到过错误。我收到的错误是:

 Cannot insert the value NULL into column 'IsPreventionForStates', table 'Staging.ControlledSubstances.NationalDrugCode'; column does not allow nulls. INSERT fails.

1 个答案:

答案 0 :(得分:1)

如果您明确提供NULL作为其值,则会发生这种情况。默认约束仅在您不提供任何值时,或者当您使用DEFAULT关键字时启动:

例如,如果NationalDrugCodeIDIsPreventionForStates是表格中仅有的两列(用于说明),则会失败:

INSERT INTO NationalDrugCode(NationalDrugCodeID, IsPreventionForStates) VALUES (5, NULL);

但其中任何一种都可行:

INSERT INTO NationalDrugCode(NationalDrugCodeID) VALUES (5);

INSERT INTO NationalDrugCode(NationalDrugCodeID, IsPreventionForStates) VALUES (5, DEFAULT);

在您需要 ALL 列插入默认值的边缘情况下,您可以使用:

INSERT INTO NationalDrugCode DEFAULT VALUES;