26
CREATE TABLE foo (
   dt     AS DATE NOT NULL,
   type   AS TEXT NOT NULL,
   CONSTRAINT unique_dt_type UNIQUE(dt,type) -- check constraint(?)
)

特定の条件のみが存在する場合に一意の制約を作成するための正しい構文を考えようとすると、頭がおかしくなります。

指定された、type値を持つことができます。日付ごとA-Fに 1 つしか存在できませんが、複数存在する可能性があります。良いテーブルの例:AB-F

2010-01-02 | 'A'  -- only one
2010-01-02 | 'B'  -- can have multiple
2010-01-02 | 'B'
2010-01-02 | 'B'
2010-01-02 | 'C'  -- can have multiple
2013-01-02 | 'A'  -- only one
2010-01-02 | 'B'  -- can have multiple
2010-01-02 | 'B'
2013-01-02 | 'F'  -- can have multiple
2013-01-02 | 'F'

チェック/一意の構文を読み取ろうとしましたが、例はありませんでした。 CHECK近づきましたが、範囲に限定しただけで、UNIQUEシナリオと組み合わせて使用​​されませんでした. 検索も試してみましたが、私の検索スキルが標準に達していないか、類似の質問がありません。

4

2 に答える 2

1

トリガーの使用:

CREATE OR REPLACE FUNCTION "CheckConstraint"()
  RETURNS trigger AS
$BODY$declare
already_exists boolean; 
begin

if new.foo_type='A' then
select count(*) >0  from foo where foo_type='A' and dt=new.dt INTO already_exists;
if already_exists then 
raise exception 'date % already have an A', new.dt;
end if;
end if;

return new;
end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
于 2013-04-08T21:13:31.767 に答える