我有一个表aliases,它将8个字符的ID映射到其他一些规范的8个字符的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(还有扩展名,任何数据库引擎)是否可以进行这种检查?

最佳答案

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

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

解决该问题的一种方法是创建一个用户定义的函数,该函数将检入表。这在SQLite中有点痛苦,因为您无法在SQL中定义函数。

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

关于sql - CHECK值不在同一表的另一列中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17385911/

10-10 19:18