2012-05-07 45 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),除非在索引中有其他列。 –

相关问题