使用TSQL进行插入时,为什么约束中存在冲突

时间:2019-06-25 16:31:42

标签: sql-server 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中有数据,但从没有,或者在{{ 1}}或SOURCE_ID,但绝不会两者都存在,但决不要让所有四个都为SOURCE_STATE_ID。 但是,当我尝试插入数据时,出现错误:

NULL

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

2 个答案:

答案 0 :(得分:0)

在我看来您应该删除C_ALL_TRADE约束。它已经包含C_TRADE_IMPORTC_TRADE_EXPORT。其余的检查将阻止您插入任何内容。

AND NOT (( SOURCE_ID IS NULL OR SOURCE_STATE_ID IS NULL ) AND ( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID IS NULL ))

这可以防止( SOURCE_ID IS NULL OR SOURCE_STATE_ID成为NULL,而( DESTINATION_ID IS NULL OR DESTINATION_STATE_ID成为NULL,但是同时您希望它们成为NULL(以前的检查)

答案 1 :(得分:0)

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)的列:如果四个列中至少有一个非列,则Coalesce( SOURCE_ID, SOURCE_STATE_ID, DESTINATION_ID, DESTINATION_STATE_ID ) is not NULL将为 true 。 -NULL值。结合前两个约束条件,将确保一个或两个值都不为NULL。