指定约束中列的上下文

时间:2013-03-01 12:29:28

标签: sqlite python-3.x

我正在使用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

任何帮助都会非常感激。谢谢。

2 个答案:

答案 0 :(得分:1)

documentation说:

  

CHECK约束的表达式可能不包含子查询。

因此,您必须注册要从CHECK表达式调用的用户定义函数,或者只是检查插入数据的代码。


在约束之外,在一般情况下,同一个表的多个实例将使用别名进行区分:

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

答案 1 :(得分:0)

您不能在检查约束中使用SELECT;来自documentation CHECK约束的表达式可能不包含子查询。

这意味着您无法使用CHECK约束执行所需操作,并且您将 在(Python)代码中执行此操作。