8

列がnullでない場合にのみ制約を適用するソリューションが必要です。ドキュメントでこれを行う方法を見つけることができないようです。

create table mytable(
  table_identifier_a INTEGER,
  table_identifier_b INTEGER,
  table_value1,...)

データの性質上、テーブルの作成時に識別子bと値を取得します。追加のデータを受け取った後、識別子aを入力できるようになります。unique key of (identifier_a, value1)この時点で、identifier_aが存在する場合にのみ確認したいと思います。

うまくいけば、それは理にかなっています、誰かが何かアイデアを持っていますか?

4

5 に答える 5

8

うーん。一意の制約は、複数の NULL 値を妨げません。

CREATE TABLE mytable (
    table_identifier_a   INTEGER    NULL,
    table_identifier_b   INTEGER    NOT NULL,
    table_value1         INTEGER    NOT NULL,

    UNIQUE(table_identifier_a, table_identifier_b)
);

identifier_b が一致する場合でも、複数の NULL を挿入できることに注意してください。

test=# INSERT INTO mytable values(NULL, 1, 2);
INSERT 0 1
test=# INSERT INTO mytable values(NULL, 1, 2);
INSERT 0 1
test=# select * from mytable;
 table_identifier_a | table_identifier_b | table_value1 
--------------------+--------------------+--------------
                    |                  1 |            2
                    |                  1 |            2
(2 rows)

ただし、重複する (a,b) ペアを作成することはできません。

test=# update mytable set table_identifier_a = 3;
ERROR:  duplicate key value violates unique constraint "mytable_table_identifier_a_key"

もちろん、問題があります。テーブルに主キーがありません。おそらくデータ モデルに問題があります。しかし、あなたはそれを修正するのに十分な詳細を提供しませんでした.

于 2009-02-24T02:06:42.853 に答える
1

1つのトランザクション内で操作全体を完了することが可能な場合は、postgresが制約を評価する時間を変更できます。

START;
SET CONSTRAINTS <...> DEFERRED;
<SOME INSERT/UPDATE/DELETE>
COMMIT;

この場合、制約はコミット時に評価されます。参照: Postgres7.4Doc-制約の設定またはPostgres8.3Doc

于 2009-02-23T22:54:58.977 に答える
1

実際には、これを 2 つのテーブルに分割することになるでしょう。2 つの異なる種類のものをモデル化しています。1枚目は初期バージョンで部分的なもので、2枚目は全体です。最初の種類のものを 2 番目の種類のものにするために必要な情報が得られたら、行を 1 つのテーブルから別のテーブルに移動します。

于 2009-02-24T02:41:23.880 に答える
0

制約の代わりにトリガーを使用してこれを処理できます。

于 2009-02-23T22:44:04.213 に答える
0

私があなたなら、テーブルを2つのテーブルに分割し、必要に応じてそれらを組み合わせたビューを作成する可能性があります。

于 2009-02-23T22:48:16.233 に答える