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_ID
或DESTINATION_STATE_ID
但从不同时有数据,或者有数据SOURCE_ID
或SOURCE_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".
我在逻辑上做错了吗?还是语法关闭?
解决方案
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。
推荐阅读
- android - 更新 chrome 版本 76 后 android 应用程序崩溃
- join - spring-data-elasticsearch es6.7.2 保存子抛出异常:连接字段缺少路由
- python - 如何一次请求多个链接并稍后用scrapy解析它们?
- c++ - 在 C++17 和 emplace_back(...) 中保证复制省略
- linux - 获取映射共享内存的大小
- python - 比较特定列上的 2 个数据框
- google-cloud-dataflow - Cloud Dataflow 中 PipelineOptions 中的窗口持续时间
- python-3.x - 如何从地理数据中获取城市
- docusignapi - Docusign 请求授权码相关查询
- laravel - 如何过滤laravel中的特定记录?