代码之家  ›  专栏  ›  技术社区  ›  Java Drinker

对列的计算值添加唯一约束

  •  4
  • Java Drinker  · 技术社区  · 16 年前

    我不太确定该怎么说,但这里… 我们有如下表格结构:

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

    对于上面给出的数据…我希望有一个约束,使这两行不能同时存在。基本上,我希望桌子是

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

    我不希望将X时间内创建的具有相同数据的行添加到数据库中,也就是说,在这种情况下,需要违反约束。问题是,上面的约束并不是我可以实际创建的。

    在你问之前,我知道,我知道…为什么呢?我知道某种情况不应该发生,但遗憾的是确实发生了。我现在需要一种权宜之计,这样我就可以花些时间调查实际情况。如果您需要其他信息,请通知我…

    2 回复  |  直到 16 年前
        1
  •  9
  •   dpbradley    16 年前

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

    应该做你想做的。

        2
  •  1
  •   Raj More    16 年前

    Oracle和SQL Server一样不支持计算列。可以使用触发器模拟计算列的功能。

    步骤如下

    1. 添加名为的列 CEILCalculation 去你的桌子。
      • 在您的表上,放置触发器将更新 天花板计算 值来自 CEIL(Timestamp/10000)*10000
      • 在三列上创建唯一索引 (Unique for (Type, ClientId, CEILCalculation)

    如果不想修改表结构,可以将 BEFORE INSERT TRIGGER 在桌子上,检查那边的有效性。

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