Обычно (я думаю) вы можете сгенерировать оператор только с одним, on conflict
который определяет одно-единственное ограничение, имеющее отношение к тому, что вы вставляете.
Потому что, как правило, «релевантным» является только одно ограничение. (Если много, то мне интересно, не выглядит ли что-то странным / необычным, хм.)
Пример:
(Лицензия: не CC0, только CC-By)
// there're these unique constraints:
// unique (site_id, people_id, page_id)
// unique (site_id, people_id, pages_in_whole_site)
// unique (site_id, people_id, pages_in_category_id)
// and only *one* of page-id, category-id, whole-site-true/false
// can be specified. So only one constraint is "active", at a time.
val thingColumnName = thingColumnName(notfificationPreference)
val insertStatement = s"""
insert into page_notf_prefs (
site_id,
people_id,
notf_level,
page_id,
pages_in_whole_site,
pages_in_category_id)
values (?, ?, ?, ?, ?, ?)
on conflict (site_id, people_id, $thingColumnName) <—— look
do update set
notf_level = excluded.notf_level
"""
val values = List(
siteId.asAnyRef,
notfPref.peopleId.asAnyRef,
notfPref.notfLevel.toInt.asAnyRef,
// Only one of these is non-null:
notfPref.pageId.orNullVarchar,
if (notfPref.wholeSite) true.asAnyRef else NullBoolean,
notfPref.pagesInCategoryId.orNullInt)
runUpdateSingleRow(insertStatement, values)
А также:
private def thingColumnName(notfPref: PageNotfPref): String =
if (notfPref.pageId.isDefined)
"page_id"
else if (notfPref.pagesInCategoryId.isDefined)
"pages_in_category_id"
else if (notfPref.wholeSite)
"pages_in_whole_site"
else
die("TyE2ABK057")
Предложение on conflict
создается динамически, в зависимости от того, что я пытаюсь сделать. Если я вставляю предпочтение уведомления для страницы, тогда может возникнуть уникальный конфликт site_id, people_id, page_id
ограничения. И если я настраиваю параметры уведомлений для категории, тогда я знаю, что ограничение, которое может быть нарушено, есть site_id, people_id, category_id
.
Итак, я могу, и, скорее всего, вы тоже, в вашем случае?, Сгенерировать правильное on conflict (... columns )
, потому что я знаю, что я хочу сделать, а затем я знаю, какое из многих уникальных ограничений является тем, которое может быть нарушено.