Проверка ограничения для новой таблицы с использованием условия IN не работает должным образом - PullRequest
0 голосов
/ 20 июня 2019

Я создал новую таблицу, включающую проверочное ограничение, используя предложение in, чтобы создать список разрешенных записей, или, по крайней мере, это был план.Команда создания таблицы выполнена без ошибок, однако в процессе тестирования я могу вставить строки без ограничения, предотвращающего неправильные значения для столбца «ПРИЧИНА»

Я провел небольшое исследование в Интернете, но я не понял, что это нашеще.Я включу оператор создания таблицы ниже.

'' '

USE TEST 
GO

CREATE TABLE EMP_POINTS (
ROWID int NOT NULL IDENTITY(1,1),
WEEK_ID nvarchar(15) NOT NULL,
EMPLOYEE_ID nvarchar(15) NOT NULL,
DATE date NOT NULL,
CAUSE nvarchar(15),
POINTS decimal(2,1),

PRIMARY KEY(EMPLOYEE_ID, DATE),
CONSTRAINT FK_EmpID FOREIGN KEY(EMPLOYEE_ID) REFERENCES EMPLOYEE(ID),
CONSTRAINT chk_cause CHECK (
                            CAUSE IN('Late In','Early Out','E & L', 'NCNS', 'Absent', '0.5','1.0', NULL)
                           )
);

' ''

Я ожидаю, что единственные значения, которые будут разрешены в ПРИЧИНЕстолбец будет идентифицирован в ограничении chk_cause, однако он позволяет вводить любые значения.

1 Ответ

0 голосов
/ 20 июня 2019
Ограничения

CHECK отличаются от условий WHERE и CASE. Ограничение CHECK не выполняется, только если результатом является явно false. Другие требуют, чтобы условие было явно true. Разница в том, как обрабатываются значения NULL.

Итак, вы можете написать свое ограничение как:

CONSTRAINT chk_cause CHECK (CAUSE IN('Late In', 'Early Out', 'E & L', 'NCNS', 'Absent', '0.5', '1.0')
                           )

Тогда будут разрешены только эти значения и NULL (при условии, что CAUSE не объявлено NOT NULL).

Проблема с вашей версией состоит в том, что другие значения приведут к NULL (из-за NULL в списке IN). И это проходит ограничение CHECK.

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