2010-07-13 189 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