Anda biasanya (menurut saya) dapat menghasilkan pernyataan dengan hanya satu on conflictyang menentukan satu-satunya kendala yang relevan, untuk hal yang Anda masukkan.
Karena biasanya, hanya satu kendala yang "relevan", pada satu waktu. (Jika banyak, maka saya bertanya-tanya apakah ada yang aneh / dirancang dengan aneh, hmm.)
Contoh:
(Lisensi: Bukan CC0, hanya 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)
Dan:
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")
The on conflictklausa yang dihasilkan secara dinamis, tergantung pada apa yang saya coba lakukan. Jika saya memasukkan preferensi pemberitahuan, untuk halaman - maka mungkin ada konflik unik, pada site_id, people_id, page_idbatasan tersebut. Dan jika saya mengonfigurasi preferensi notifikasi, untuk kategori - maka saya tahu bahwa batasan yang bisa dilanggar adalah site_id, people_id, category_id.
Jadi saya bisa, dan kemungkinan besar Anda juga, dalam kasus Anda ?, menghasilkan yang benar on conflict (... columns ), karena saya tahu apa yang ingin saya lakukan, dan kemudian saya tahu satu dari sekian banyak kendala unik, yang dapat dilanggar.