在列的计算值上添加唯一约束

时间:2010-07-13 18:50:42

标签: sql database oracle

我不确定如何表达这一点,但这里有...... 我们有一个如下表格结构:

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

现在对于上面给出的数据......我希望有一个约束,以便这两行不能一起存在。基本上,我希望表格

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

我不希望将在彼此的X时间内创建的相同数据的行添加到数据库中,即在这种情况下需要约束违规。问题是,上述约束不是我实际可以创建的。

在你问之前,我知道,我知道......为什么对?我知道某种情况不应该发生,但唉。我现在需要一种止损措施,所以我可以花一些时间来调查实际问题。如果您需要其他信息,请告诉我......

2 个答案:

答案 0 :(得分:9)

是的,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.

应该做你想做的事。

答案 1 :(得分:1)

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

以下是此

的步骤
  1. 在表格中添加名为CEILCalculation的列。
    • 在您的桌面上,触发器会使用CEILCalculation
    • 中的值更新CEIL(Timestamp/10000)*10000
    • 在三列(Unique for (Type, ClientId, CEILCalculation)
    • 上创建唯一索引
  2. 如果您不想修改表格结构,可以在表格上放置BEFORE INSERT TRIGGER并检查其中的有效性。

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