0

私はsqlite3を使用しています。日付範囲が既存の日付範囲と重ならないように制約を作成できるようにしたいと思います。それらが重複している場合は、foobarIdが同じでない限り問題ありません。私の問題は、以下に示すサンプルコードでコンテキストをどのように指定するかです(query.コンテキストを表示するためにプレフィックスを使用しました)。これがまったく有効かどうかさえわかりません。これは、SQLコードよりもPythonコードの方が適切だと思いますが、それでも可能かどうかを知りたいと思いました。

サンプルコード

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 に答える