Вы можете использовать индекс на основе функции:
create unique index duel_uk on duel
( least(numpilot1, numpilot2), greatest(numpilot1, numpilot2));
Ответ, который вы явно ищете, - это триггер, подобный этому:
create trigger duel_trg
before insert on duel
for each row
declare
dummy number;
begin
select count(*)
into dummy
from duel
where (numpilot1 = :new.numpilot1 and numpilot2 = :new.numpilot2)
or (numpilot1 = :new.numpilot2 and numpilot2 = :new.numpilot1);
if dummy > 0 then
raise_application_error(-20001,'You lose');
end if;
end;
Однако это не сможет обеспечить целостность в многопользовательской (или многосессионной) среде, поскольку это может произойти:
User1> insert into duel (numpilot1, numpilot2) values (1,2);
-- trigger checks, all seems OK
User2> insert into duel (numpilot1, numpilot2) values (1,2);
-- trigger checks, all seems OK (can't see User1's new row
-- as it hasn't been committed)
User1> commit;
User2> commit;
Результат: повреждена база данных. Поэтому, хотя этот триггер может удовлетворить учителя, это плохое решение, и вместо него следует использовать ограничения (желательно решение Джастина, а не мое!)