1

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

SQLite 与 窒息no such table: aliases,这是有道理的,看看如何aliases还不存在。SQLite(以及任何数据库引擎)有没有办法进行这种检查?

4

1 回答 1

2

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

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

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

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

于 2013-06-30T00:43:15.547 回答