2010-07-13 177 views
2

的计算值,我不完全知道如何短语这一点,但在这里不用... 我们有类似如下的表结构:添加唯一约束列

Id | Timestamp | Type | Clientid | ..others.. 
001 | 1234567890 | TYPE1 | CL1234567 |.....  
002 | 1234561890 | TYPE1 | CL1234567 |.....  

现在的上面给出的数据...我想有一个约束,以便这两行不能一起存在。从本质上讲,我想表是

Unique for (Type, ClientId, CEIL(Timestamp/10000)*10000) 

我不想与对方的X时间内创建要添加到数据库相同的数据行,即想违反约束在这种情况下。问题是,上述约束不是我实际可以创建的。

在你问,我知道,我知道....为什么是正确的?那么我知道某种情况不应该发生,但可惜。我现在需要一种止损措施,所以我可以花一些时间来调查实际情况。如果您需要更多信息,请告知我...

回答

8

是的,Oracle支持计算列:

SQL> alter table test add calc_column as (trunc(timestamp/10000)); 

Table altered. 

SQL> alter table test 
    add constraint test_uniq 
    unique (type, clientid, calc_column); 

Table altered. 

应该做你想要什么。

+0

类似的问题,但如果我不得不添加一个新的列,这看起来像要走的路。我喜欢使用trunc的想法,而不是我正在做的事情(少一个数学运算)。现在看看数据库人员是否发现这种并发症。 – 2010-07-13 19:36:40

1

AFAIK,Oracle不支持像SQL Server这样的计算列。您可以使用触发器模拟计算列的功能。

下面是步骤执行这一

  1. 添加一个名为CEILCalculation到表列。
    • 你的桌子上,把一个触发器将与值更新CEILCalculationCEIL(Timestamp/10000)*10000
    • 在三列(Unique for (Type, ClientId, CEILCalculation)

创建唯一索引如果你不想修改表结构,你可以把BEFORE INSERT TRIGGER放在桌子上,并检查那里的有效性。

http://www.techonthenet.com/oracle/triggers/before_insert.php

+0

Thx的快速信息...我也想过这个...我想避免添加列等,并修改架构太多。问题是表格是巨大的,经常使用/更新 – 2010-07-13 19:08:02