我正在使用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)约束是不幸的。你有什么建议吗?
答案 0 :(得分:6)
您可以创建基于函数的索引
CREATE UNIQUE INDEX idx_unique_edge
ON map( greatest( point_one, point_two ),
least( point_one, point_two ) );
我假设point_one
和point_two
的数据类型与Oracle greatest
和least
函数兼容。如果没有,你需要自己的功能,选择最好的"和#34;至少"指出您的复杂数据类型。
答案 1 :(得分:0)
使用触发器可以轻松获得所需的结果。
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);
创建了一行。
SQL>插入地图值(2,1,10); 插入地图值(2,1,10) * 第1行的错误: ORA-21000:raise_application_error的错误编号参数为-100 范围 ORA-06512:at" C ## MINA.TR_MAP",第10行 ORA-04088:执行触发器时发生错误' C ## MINA.TR_MAP'
我仍然在考虑CHECK约束,但是我是否有可能会判断是否可能。