3

3つの列A(、B、C)を持つテーブルがあり、2つの制約があります

  1. A と B は共に一意である必要があります。これは、一意の制約を定義することによって行いました。
  2. A の任意の値に対して、C には True が 1 つだけ存在できます。(A, C=True) は一意である必要があります。2 番目の制約を定義する際に助けが必要です。

例: データセット

A:紀元前

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キーワード引数 to Index( docsを参照) を使用して、SQLAlchemy で部分インデックスを定義できます。

移植可能な方法は、これを少なくとも 2 つのテーブルに分割し、明示的なブール列を暗黙的な「参照テーブルに存在する」式に変換することです。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 に答える