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

任何帮助将非常感激。谢谢。

4

2 回答 2

1

文档说:

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

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


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

SELECT child.id, parent.id
FROM person AS child
JOIN person AS parent ON child.parentId = parent.id
于 2013-03-01T13:03:45.213 回答
0

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

这意味着您无法使用 CHECK 约束做您想做的事情,而您必须(Python) 代码中执行此操作。

于 2013-03-01T13:05:21.907 回答