2013-03-01 69 views
0

我正在使用sqlite3。我希望能夠制定一個約束,以確保日期範圍不會與現有日期範圍重疊。如果它們確實重疊,那麼只要foobarId不一樣。我的問題是你如何指定我在下面給出的示例代碼中的上下文(我試圖將前綴query.作爲嘗試顯示上下文)?我甚至不確定這是否有效,我猜這在我的python代碼而不是我的sql代碼中更合適,但我想知道它是否可能。指定約束中列的上下文

示例代碼

cursor.execute("""CREATE TABLE foobar (
    foobarId INT, 
    dateFrom DATE, 
    dateTo DATE, 
    CONSTRAINT valid CHECK ((SELECT * FROM foobar WHERE (query.dateFrom < dateFrom < query.dateTo OR query.dateFrom < dateTo < query.dateTo) AND foobarId = query.foobarId) IS NULL) 
)""") 

示例數據

foobarid dateFrom dateTo 
1   2013.03.01 2013.03.04 
1   2013.03.04 2013.03.06 
2   2013.03.05 2013.03.07 
3   2013.03.03 2013.03.05 
1   2013.03.05 2013.03.07 Invalid 

任何幫助將非常感激。謝謝。

+0

在表達式'a 2013-03-01 13:00:02

+0

我知道,我只是減少了代碼的數量,因爲這條線變得非常長。 – 2013-03-01 13:53:13

回答

1

documentation說:

CHECK約束的表達可能不包含子查詢。

所以,你必須註冊一個用戶自定義函數從CHECK表達調用,或者只是做在插入數據的代碼檢查。


外部約束,在一般情況下,在同一個表的多個實例將與別名區分:

SELECT child.id, parent.id 
FROM person AS child 
JOIN person AS parent ON child.parentId = parent.id 
+0

很好的答案,非常感謝。 – 2013-03-01 13:51:52

0

不能使用在檢查約束一個SELECT;從documentationCHECK約束的表達式可能不包含子查詢。

這意味着你不能用CHECK約束來做你想做的事,而你需要來代替(Python)代碼。

+0

感謝您的回覆。真的很感激它。我更喜歡CL對你的回答,因爲他們提供了更多的信息並回答了關於指定上下文的問題。 – 2013-03-01 13:57:22

+0

不是一個問題,它總是*您的*特權挑選最有幫助的答案! :-) – 2013-03-01 14:06:23