2012-05-07 11 views
3

タイムスタンプ列を持つテーブルを作成しようとしています。問題は、月と年の組み合わせをユニークにすることです。私はこれを試してみましたが、それは助けにはならない:一意のチェックでタイムスタンプから月と年を抽出しますか?

CREATE TABLE adempiere.SOIP_Deudas (
    --Columnas del sistema 
    SOIP_Deudas_ID  numeric(10)  NOT NULL PRIMARY KEY, 
    ad_client_id numeric(10)  NOT NULL, 
    ad_org_id numeric(10)  NOT NULL, 
    updatedby numeric(10)  NOT NULL, 
    createdby numeric(10)  NOT NULL, 
    updated  timestamp  NOT NULL, 
    created  timestamp  NOT NULL, 
    isactive char(1)  DEFAULT 'Y'::bpchar NOT NULL, 

    --Columnas del usuario 
    SOIP_Departamentos_ID numeric(10) NOT NULL, 
    fecha  timestamp NOT NULL, 
    monto  real  NOT NULL DEFAULT 0, 

    FOREIGN KEY (SOIP_Departamatos_ID) REFERENCES SOIP_Departamentos(SOIP_Departamentos_ID), 
    UNIQUE (EXTRACT (MONTH FROM TIMESTAMP fecha), EXTRACT(YEAR FROM TIMESTAMP fecha)) 
) 

特定の年と月の列を持つことなく、私はそれを行うことができる方法の任意のアイデア?

ありがとうございました。

答えて

3

迅速な回避策:

create unique index on adempiere.SOIP_Deudas (EXTRACT (MONTH FROM fecha), EXTRACT(YEAR FROM fecha)); 
+0

が魅力のように働いた、ありがとうございました。 – Uri

+2

これは少し速いかもしれませんが、 '(date_trunc( 'month'、fecha))'にインデックスを付けることです。 http://www.postgresql.org/docs/current/interactive/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC – kgrittn

+1

@kgrittnまたは: 'date_trunc( 'month'、fecha):: date'、なぜなら' datetrunc( ) 'はタイムスタンプを返し、日付(8または4バイト - >インデックスサイズ)のみが必要です。しかし、[データ整列と埋め込みのために、インデックスに追加の列がない限り、保存された4バイトは無駄になります(http://stackoverflow.com/a/7431468/939860)。 –

関連する問題