Anda biasanya (menurut saya) dapat menghasilkan pernyataan dengan hanya satu on conflict
yang 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 conflict
klausa 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_id
batasan 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.