3

我有一个包含 3 列 A(, B, C) 的表并且有 2 个约束

  1. A 和 B 应该是共同唯一的,我通过定义唯一约束来完成。
  2. 对于 A 中的任何给定值,C 中只能有一个 True。 (A, C=True) 必须是唯一的。我需要帮助来定义第二个约束。

例如数据集

答:公元前

a1:b1:假

a1:b2:真

a1:b3:错误

a2:b1:真

a2:b2:错误

a2:b3:错误

4

1 回答 1

3

我不认为这可以在不更改架构的情况下以数据库可移植的方式表达。部分索引可以做到这一点:

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 模型定义,因为我不确定哪种解决方案最适合您的需求。

于 2013-08-24T11:29:09.980 回答