Почему в моем ограничении возникает конфликт при вставке с использованием TSQL - PullRequest
0 голосов
/ 25 июня 2019

У меня есть таблица, настроенная с помощью 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".

Я что-то не так делаю логически?или синтаксис выключен?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

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 ).

Вы можете использовать все столбцы с одинаковым типом данных (int): Coalesce( SOURCE_ID, SOURCE_STATE_ID, DESTINATION_ID, DESTINATION_STATE_ID ) is not NULL будет true , если хотя бы один из четырех столбцов имеет значение, отличное от NULL. В сочетании с первыми двумя ограничениями это гарантирует, что одно или два значения не равны NULL.

0 голосов
/ 25 июня 2019

Мне кажется, что вы должны удалить ограничение 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 TO BE NULL, но в то же время вы хотите, чтобы они былиNULL (предыдущие проверки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...