Что означает ограничение исключения `EXCLUDE USING gist (c WITH &&) '?
Из документа PostgreSQL
Ограничения исключения гарантируют, что, если любые две строки сравниваются в указанных столбцах или выражениях с использованием указанных операторов, по крайней мере одно из этих сравнений операторов вернет false или null. Синтаксис:
CREATE TABLE circles ( c circle, EXCLUDE USING gist (c WITH &&) );
Мне было интересно, что EXCLUDE USING gist (c WITH &&)
средства? Особенно, gist()
, c WITH &&
а также EXCLUDE USING
,
Можно ли это переписать с точки зрения check
? Благодарю.
1 ответ
Принимая во внимание, что CHECK
ограничение оценивает выражение на основе одной строки таблицы, EXCLUDE
Ограничение оценивает сравнение двух строк в таблице. Думайте об этом как обобщенно UNIQUE
ограничение: вместо "никакие две строки не могут быть равными", вы можете сказать что-то вроде "никакие две строки не перекрываются" или даже "никакие две строки не могут быть разными".
Чтобы достичь этого, не проверяя каждую возможную комбинацию значений, ему нужна соответствующая структура индекса, которая позволяет находить возможные нарушения при вставке или обновлении строки. Это то, что gist
Часть объявления относится к: определенному типу индекса, который может использоваться для ускорения операций, отличных от равенства.
Остальная часть объявления - это само ограничение: c
проверяется колонка, и &&
является оператором, который не должен возвращать true для любой пары строк. В этом случае, &&
является оператором "перекрытий", как указано на странице руководства по геометрическим операторам.
Так что вместе, ограничение EXCLUDE USING gist (c WITH &&)
переводится как "нет двух значений c
должны перекрывать друг друга (точнее, A.c && B.c
должен вернуть false или null для всех отдельных строк A
а также B
), и, пожалуйста, используйте gist
Индекс для контроля этого ограничения ".