CHECK值不存在于同一表中的另一列中

时间:2013-06-30 00:19:26

标签: sql sqlite python-3.x sqlalchemy

我有一个表aliases,它将8-char ID映射到其他一些规范的8-char ID。我希望数据库引擎确保没有循环。使用SQLAlchemy,表描述(略微简化):

Table('aliases', database,
    Column('from', CHAR(8), primary_key = True),
    Column('to', CHAR(8), nullable = False),
    CheckConstraint('"to" not in (select "from" from aliases)')
)

生成以下SQL:

CREATE TABLE aliases (
    "from" CHAR(8) NOT NULL, 
    "to" CHAR(8) NOT NULL, 
    PRIMARY KEY ("from"), 
    CHECK ("to" not in (select "from" from aliases))
)

带有no such table: aliases的SQLite扼流圈,这有助于了解aliases尚不存在。有没有办法让SQLite(以及扩展,任何数据库引擎)进行这种检查?

1 个答案:

答案 0 :(得分:2)

检查约束不能包含子查询(sqlite.org/lang_createtable.html)。

在支持检查约束的数据库中通常都是这样。

一种方法是创建一个用户定义的函数来检查表。这在SQLite中有点痛苦,因为你无法在SQL中定义函数。

另一种方法是在插入或更新值时使用触发器。触发器可以使用子查询来实现您的目标。