我有一个包含 3 列 A(, B, C) 的表并且有 2 个约束
- A 和 B 应该是共同唯一的,我通过定义唯一约束来完成。
- 对于 A 中的任何给定值,C 中只能有一个 True。 (A, C=True) 必须是唯一的。我需要帮助来定义第二个约束。
例如数据集
答:公元前
a1:b1:假
a1:b2:真
a1:b3:错误
a2:b1:真
a2:b2:错误
a2:b3:错误
我有一个包含 3 列 A(, B, C) 的表并且有 2 个约束
例如数据集
a1:b1:假
a1:b2:真
a1:b3:错误
a2:b1:真
a2:b2:错误
a2:b3:错误
我不认为这可以在不更改架构的情况下以数据库可移植的方式表达。部分索引可以做到这一点:
CREATE UNIQUE INDEX One_C_Per_A_Idx ON Table(A) WHERE C;
但它仅在 PostgreSQL 和 SQL Server 上可用(并在 Oracle 上使用功能索引进行模拟)。使用 PostgreSQL 后端,您可以使用postgresql_where
关键字参数Index
(请参阅文档)在 SQLAlchemy 中定义部分索引。
一种可移植的方法是将其拆分为至少两个表,将显式布尔列转换为隐式的“存在于引用表中”表达式。SQL:
CREATE TABLE my_table (
a integer NOT NULL,
b integer NOT NULL,
PRIMARY KEY (a, b)
);
CREATE TABLE flagged (
a integer NOT NULL PRIMARY KEY,
b integer NOT NULL,
FOREIGN KEY (a, b) REFERENCES my_table(a, b)
);
查询以获取原始表的等效项:
SELECT t.a, t.b, f.a IS NOT NULL AS c
FROM my_table t LEFT OUTER JOIN flagged f ON t.a = f.a AND t.b = f.b;
我现在将省略 SQLAlchemy 模型定义,因为我不确定哪种解决方案最适合您的需求。