我正在使用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 :(得分:1)
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)代码中执行此操作。