Thông thường, bạn có thể (tôi nghĩ) tạo ra một câu lệnh chỉ có một câu lệnh on conflict
xác định ràng buộc một và duy nhất có liên quan, cho thứ bạn đang chèn.
Bởi vì thông thường, tại một thời điểm chỉ có một ràng buộc là "có liên quan". (Nếu nhiều, thì tôi đang tự hỏi liệu có thứ gì đó kỳ lạ / được thiết kế kỳ quặc không, hmm.)
Ví dụ:
(Giấy phép: Không phải CC0, chỉ 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)
Và:
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")
Các on conflict
khoản được tạo động, tùy thuộc vào những gì tôi đang cố gắng làm. Nếu tôi đang chèn tùy chọn thông báo, cho một trang - thì có thể có một xung đột duy nhất, về site_id, people_id, page_id
ràng buộc. Và nếu tôi đang định cấu hình prefs thông báo, cho một danh mục - thì thay vào đó tôi biết rằng ràng buộc có thể bị vi phạm site_id, people_id, category_id
.
Vì vậy, tôi có thể, và khá có khả năng bạn cũng vậy, trong trường hợp của bạn ?, tạo ra đúng on conflict (... columns )
, bởi vì tôi biết những gì tôi muốn làm, và sau đó tôi biết một trong nhiều ràng buộc duy nhất, là ràng buộc có thể bị vi phạm.