Por lo general, creo que puede generar una declaración con solo una on conflict
que especifica la única restricción que es relevante para lo que está insertando.
Porque normalmente, solo una restricción es la "relevante", a la vez. (Si hay muchos, entonces me pregunto si algo tiene un diseño extraño / extraño, hmm).
Ejemplo:
(Licencia: No CC0, solo 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)
Y:
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")
La on conflict
cláusula se genera dinámicamente, dependiendo de lo que estoy tratando de hacer. Si estoy insertando una preferencia de notificación, para una página, entonces puede haber un conflicto único en la site_id, people_id, page_id
restricción. Y si estoy configurando preferencias de notificación, para una categoría, entonces sé que la restricción que puede violarse es site_id, people_id, category_id
.
Entonces, puedo, y es muy probable que usted también, en su caso, generar la correcta on conflict (... columns )
, porque sé lo que quiero hacer, y luego sé cuál de las muchas restricciones únicas es la que puede ser violada.