Вы можете использовать уникальный индекс на основе функции.В CASE
возвращает GUID, когда id3
равно нулю.Если он не возвращает действительное значение id1
или id2
, соответственно.
Единственная проблема заключается в том, что типы в ветвях CASE
должны быть совместимы.Вот почему я конвертирую их в символы здесь.Возможно, вы можете сделать это по-разному, в зависимости от типа данных id1
и id2
.
CREATE UNIQUE INDEX i_t_id3_nn_id1_id2
ON t
(CASE
WHEN id3 IS NULL THEN
to_char(id1)
ELSE
rawtohex(sys_guid())
END,
CASE
WHEN id3 IS NULL THEN
to_char(id2)
ELSE
rawtohex(sys_guid())
END);
db <> fiddle ;
Другойальтернатива будет спусковым крючком конечно.Но метод индекса, хотя и немного уродливый, может оказаться более производительным.