【问题标题】:How can I make a unique constraint order independently on two columns如何在两列上独立创建唯一约束顺序
【发布时间】:2015-03-13 19:36:42
【问题描述】:

我正在使用 Oracle 数据库,我需要创建如下表。

MAP(Point_One, Poin_Two, Connection_weight).

该表表示有关图表的数据。我想创建一个带有约束的表,以防止插入已经存在的连接。

例如,表中已经包含这个连接:

Point_One | Point_Two | Connection_weight
-----------------------------------------
p_no1     | p_no2     | 10

即使我尝试以不同的顺序添加点,约束也会阻止重复插入此连接。 (例如:(p_no2, p_no1, 10))

不幸的是,一个简单的 UNIQUE (Point_One, Point_Two) 约束是不够的。你有什么建议吗?

【问题讨论】:

    标签: sql oracle unique-constraint


    【解决方案1】:

    您可以创建基于函数的索引

    CREATE UNIQUE INDEX idx_unique_edge
        ON map( greatest( point_one, point_two ),
                least( point_one, point_two ) );
    

    我假设point_onepoint_two 的数据类型与Oracle greatestleast 函数兼容。如果没有,您需要自己的函数来为您的复杂数据类型选择“最大”和“最小”点。

    【讨论】:

    • 这是个好主意
    【解决方案2】:

    您可以使用触发器轻松实现所需的结果。

     create table map (point_one number, point_two number, connection_weight number)
    /
     create or replace trigger tr_map before insert on map
     for each row
     declare
     c number;
       begin
         select count(1) into c from map where (point_one=:new.point_one and   point_two=:new.point_two)
         or
         (point_one=:new.point_two and point_two=:new.point_one);
         if c>0 then
         raise_application_error(-20000,'Connection line already exists');
      end if;
    end;
      /
    

    SQL> 插入映射值 (1,2,10);

    已创建 1 行。

    SQL> 插入映射值 (2,1,10); 插入地图值(2,1,10) * 第 1 行的错误: ORA-21000: raise_application_error of -100 的错误号参数超出 范围 ORA-06512: 在“C##MINA.TR_MAP”,第 10 行 ORA-04088: 执行触发器 'C##MINA.TR_MAP' 期间出错

    我仍在考虑 CHECK 约束,但我还没有决定是否可能。

    【讨论】:

    • 只要您只使用INSERT ... VALUES 语句进行单行插入,此方法就可以工作。只要你想做一个基于集合的INSERT ... SELECT,你就会得到一个变异表异常。通常,在表上定义的行级触发器(在这种情况下为map)不能直接查询该表。所以这个行级触发器一般是不允许查询map的。您可以通过创建行级触发器和语句级触发器以及带有集合的包来解决此问题,但这开始变得相当复杂。
    • 在 Oracle 11.2 中,您可以创建一个复合触发器。但是通常通过触发器强制执行约束是个坏主意
    猜你喜欢
    • 2020-10-12
    • 2012-07-10
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2021-09-23
    • 2012-01-04
    相关资源
    最近更新 更多