我有一个表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/