我有一个使用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_ID
或DESTINATION_STATE_ID
中有数据,但从没有,或者在{{ 1}}或SOURCE_ID
,但绝不会两者都存在,但决不要让所有四个都为SOURCE_STATE_ID
。
但是,当我尝试插入数据时,出现错误:
NULL
我在逻辑上做错了吗?还是语法关闭?
答案 0 :(得分:0)
在我看来您应该删除C_ALL_TRADE
约束。它已经包含C_TRADE_IMPORT
和C_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。