2015-10-03 28 views
1

我有一個學校的「項目」工作,其中有一些表和一個表需要有一個約束,這是不適合我的工作。約束檢查行和其他行在同一時間不爲空

有一些表,如問題,答案和反應。 一個反應屬於一個問題或一個答案,但不是在同一時間。 還有由我有2行:

question_id   NUMBER, 
    answer_id   NUMBER, 

兩個不爲空,因爲通過斜面空,但不是在同一時間。

我已經作出約束,但不工作..

/* CHECK if reaction belongs to an question or a answer    NOT WORKING YET*/ 
CONSTRAINT CHECK_question_or_answer CHECK((answer_id != NULL AND question_id = NULL) OR (answer_id = NULL OR question_id != NULL)) 

已經測試過的約束,我可以不用question_id或answer_id插入值。 我希望它有點清楚,如果不是,我很高興喲試着更好地解釋自己。 (仍然在SQL上newby)

謝謝。

+0

你使用MySQL或Oracle? 「 –

+1

」已經測試了約束,我可以插入一個沒有question_id或answer_id的值。「那麼,這個用例對你來說工作不正常呢? – Mureinik

+2

**'IS NULL'或'IS NOT NULL' **。 'NULL'的比較運算符總是會產生NULL NULL – lad2025

回答

2

你的約束:

CONSTRAINT CHECK_question_or_answer CHECK((answer_id != NULL AND profile_id = NULL) OR (answer_id = NULL OR profile_id != NULL)) 

是始終FALSE

您需要使用IS NULLIS NOT NULL,如:

CONSTRAINT CHECK_question_or_answer CHECK((answer_id IS NOT NULL AND profile_id IS NULL) OR (answer_id IS NULL OR profile_id IS NOT NULL)) 

這是因爲比較符!= , = , > , <,NULL結合產生NULL和被視爲假。

演示:

SELECT 1 
FROM dual 
WHERE 1 IS NOT NULL; 

SELECT 1 
FROM dual 
WHERE 1 != NULL; 

doc

NULL值代表缺失的或未知的數據。 NULL值用作 佔位符或作爲列中的默認條目以指示沒有 實際數據存在。 NULL在SQL中是無類型的,這意味着它不是一個整數,一個字符或任何其他特定的數據類型。

請注意,NULL與空數據字符串或 數值「0」不同。雖然NULL表示沒有值,但 空字符串和數字零都表示實際值。

儘管可以分配一個NULL值,但它不能等同於 任何東西,包括它本身。

因爲NULL不代表或等同於數據類型,則無法 測試與任何比較操作符NULL值,如=,<,或者 <>。

IS NULL和IS NOT NULL運算符用於測試NULL值 值。

+0

@JimVercoelen看到我更新的答案,希望現在清楚 – lad2025

0

反過來做。把主表的ID放在其他類似的地方

question table 
-------------- 
id 
text 
... 


answers table 
------------- 
id 
question_id 
text 
... 


reactions table 
--------------- 
id 
question_id 
text 
... 

question_id從不爲空。然後,您可以使用left join從兩個表中獲取結果 - 其中一個將無結果。

select * 
from questions q 
left join answers a on a.question_id = q.id 
left join reactions r on r.question_id = q.id 
0

雖然@ lad2025s的答案對兩列很有用,但如果您想將方法擴展到兩個以上,它可能會有點麻煩。

柔性替代方案是:

check ((case when answer_id is null then 0 else 1 end + 
     case when question_id is null then 0 else 1 end) = 1) 

它延伸到井檢查空(或非空)值的列的任意數量的特定的計數。

舉例來說,如果你有COLUMN_1,COLUMN_2,欄3,和column_4,並希望他們的至少1爲非空,那麼:

check ((case when column_1 is null then 0 else 1 end + 
     case when column_2 is null then 0 else 1 end + 
     case when column_3 is null then 0 else 1 end + 
     case when column_4 is null then 0 else 1 end) >= 1)