首页 > 解决方案 > 当我使用 TSQL 插入时,为什么我的约束中有冲突

问题描述

我有一个使用 TSQL 设置的表:

CREATE TABLE NORM_TRADE_AMOUNT
(
SOURCE_ID INT NULL
, SOURCE_STATE_ID INT NULL
, DESTINATION_ID INT NULL
, DESTINATION_STATE_ID INT NULL
, CONSTRAINT C_TRADE_IMPORT
    CHECK( SOURCE_ID IS NULL OR SOURCE_STATE_ID IS NULL )
, CONSTRAINT C_TRADE_EXPORT
    CHECK( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID IS NULL )
, CONSTRAINT C_ALL_TRADE
    CHECK(          (( SOURCE_ID IS NULL OR SOURCE_STATE_ID IS NULL ) OR ( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID IS NULL ))
            AND NOT (( SOURCE_ID IS NULL OR SOURCE_STATE_ID IS NULL ) AND ( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID IS NULL ))
    )
, CONSTRAINT FK_SOURCE FOREIGN KEY (SOURCE_ID) REFERENCES NORM_COUNTRY(COUN_F_ID)
, CONSTRAINT FK_SOURCE_STATE FOREIGN KEY (SOURCE_STATE_ID) REFERENCES NORM_STATE(STATE_F_ID)
, CONSTRAINT FK_DESTINATION FOREIGN KEY (DESTINATION_ID) REFERENCES NORM_COUNTRY(COUN_F_ID)
, CONSTRAINT FK_DESTINATION_STATE FOREIGN KEY (DESTINATION_STATE_ID) REFERENCES NORM_STATE(STATE_F_ID)
)

我正在尝试插入数据,例如:

INSERT INTO NORM_TRADE_AMOUNT
VALUES(NULL,6033001,NULL,NULL)
,(NULL,6033002,NULL,NULL)
,(NULL,6033004,NULL,NULL)
,(NULL,6033005,NULL,NULL)

我认为已经设置了表格,以便我至少有四列中的一列有数据,同时有数据DESTINATION_IDDESTINATION_STATE_ID但从不同时有数据,或者有数据SOURCE_IDSOURCE_STATE_ID但从不同时有数据,但从不让所有四列都存在NULL。然而,当我尝试插入数据时,出现错误:

The INSERT statement conflicted with the CHECK constraint "C_ALL_TRADE". The conflict occurred in database "RT_AGR_STG_DW", table "dbo.NORM_TRADE_AMOUNT".

我在逻辑上做错了吗?还是语法关闭?

标签: sql-servertsql

解决方案


CONSTRAINT C_TRADE_IMPORT CHECK( SOURCE_ID IS NULL OR SOURCE_STATE_ID IS NULL )确保您不会在列中都放置非 NULL 值。与CONSTRAINT C_TRADE_EXPORT CHECK( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID IS NULL ).

您可以利用所有具有相同数据类型 ( int) 的列:如果四列中的至少一列具有非 NULL 值,则为Coalesce( SOURCE_ID, SOURCE_STATE_ID, DESTINATION_ID, DESTINATION_STATE_ID ) is not NULL结合前两个约束,它将确保一个或两个值不为 NULL。


推荐阅读