我有一个表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(以及扩展,任何数据库引擎)进行这种检查?
答案 0 :(得分:2)
检查约束不能包含子查询(sqlite.org/lang_createtable.html)。
在支持检查约束的数据库中通常都是这样。
一种方法是创建一个用户定义的函数来检查表。这在SQLite中有点痛苦,因为你无法在SQL中定义函数。
另一种方法是在插入或更新值时使用触发器。触发器可以使用子查询来实现您的目标。