我一直在爲這個檢查約束掙扎幾個小時,並希望有人會友好地解釋爲什麼這個檢查約束沒有做我認爲應該做的事情。Oracle檢查約束
ALTER TABLE CLIENTS
add CONSTRAINT CHK_DISABILITY_INCOME_TYPE_ID CHECK ((IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL) OR (IS_DISABLED = 0 AND DISABILITY_INCOME_TYPE_ID IS NULL) OR (IS_DISABLED = 1));
從本質上講,您必須被禁用才能收集傷殘收入。看來好像這個檢查約束(IS_DISABLED IS NULL AND DISABILITY_INCOME_TYPE_ID IS NULL)
的第一部分沒有被執行(見下文)。
DISABILITY_INCOME_TYPE_ID
的可用值是1和2,這是通過外鍵強制執行的。 IS_DISABLED
和DISABILITY_INCOME_TYPE_ID
都可以爲空。
-- incorrectly succeeds (Why?)
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, 2);
-- correctly fails
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, 2);
-- correctly succeeds
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (0, null);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, 1);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, 2);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (1, null);
INSERT INTO CLIENTS (IS_DISABLED, DISABILITY_INCOME_TYPE_ID) VALUES (null, null);
感謝您的幫助, 邁克爾
只是驗證我看到了與Oracle 10.2.0.4.0相同的行爲。 – 2008-11-14 22:41:48