在 PostgreSQL 中實現 `lck`, `special`, `item` 與 `org_id` 或 `user_id` 組合唯一的約束

在 PostgreSQL 中實現 lck, special, itemorg_iduser_id 組合唯一的約束

要實現 lck, special, item 這三個字段必須與 org_iduser_id 中的一個(但不能同時)組合唯一的約束,你需要創建以下約束:

方案1:使用兩個唯一約束 + 檢查約束

ALTER TABLE hs_charging
-- 確保 org_id 和 user_id 不同時為 NULL 且不同時有值
ADD CONSTRAINT org_or_user_check CHECK ((org_id IS NOT NULL AND user_id IS NULL) OR(org_id IS NULL AND user_id IS NOT NULL)
);-- 為 org_id 組合創建唯一約束
ALTER TABLE hs_charging
ADD CONSTRAINT unique_with_org UNIQUE (lck, special, item, org_id)
WHERE org_id IS NOT NULL;-- 為 user_id 組合創建唯一約束
ALTER TABLE hs_charging
ADD CONSTRAINT unique_with_user UNIQUE (lck, special, item, user_id)
WHERE user_id IS NOT NULL;

方案2:使用部分索引實現(更簡潔)

-- 確保 org_id 和 user_id 只能填一個
ALTER TABLE hs_charging
ADD CONSTRAINT org_or_user_check CHECK ((org_id IS NULL) <> (user_id IS NULL)
);-- 為 org_id 情況創建唯一部分索引
CREATE UNIQUE INDEX unique_with_org ON hs_charging (lck, special, item, org_id)
WHERE org_id IS NOT NULL;-- 為 user_id 情況創建唯一部分索引
CREATE UNIQUE INDEX unique_with_user ON hs_charging (lck, special, item, user_id)
WHERE user_id IS NOT NULL;

說明

  1. CHECK 約束確保 org_iduser_id 有且只有一個有值
  2. 兩個唯一約束/索引分別處理兩種情況:
    • 當使用 org_id 時,lck, special, item, org_id 組合必須唯一
    • 當使用 user_id 時,lck, special, item, user_id 組合必須唯一
  3. 使用 WHERE 子句的部分索引/約束可以更高效地實現這種條件唯一性

方案2使用部分索引通常更受推薦,因為它更靈活且性能更好。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83946.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

g++ a.cpp -o a ‘pkg-config --cflags --libs opencv4‘/usr/bin/ld: 找不到 沒有那個文件或目錄

這個錯誤表明 pkg-config 命令沒有正確執行&#xff0c;導致編譯器無法找到 OpenCV 的庫文件和頭文件路徑。pkg-config 是一個工具&#xff0c;用于查詢已安裝庫的編譯和鏈接選項。如果 pkg-config 無法找到 OpenCV 的配置文件&#xff0c;就會導致這個錯誤。 以下是解決這個問…

定制平板在智能家居中能做些什么?全面解析其核心功能

大家有沒有發現&#xff0c;現在智能家居越來越普及了&#xff0c;很多家庭都在逐步升級自己的居住體驗。而在這一過程中&#xff0c;一種設備正悄悄地取代我們以前常用的開關面板和手機APP&#xff0c;成為整個家庭智能控制的核心&#xff0c;這就是——定制平板。 它可不是我…

【通俗易懂】Linux 線程調度策略詳解

引言&#xff1a;CPU是廚房&#xff0c;調度器是主廚 要真正理解Linux如何處理成千上萬個并發任務&#xff0c;不妨把它想象成一個繁忙的專業廚房。這個比喻不僅能讓抽象概念變得具體&#xff0c;更能揭示其背后深刻的設計哲學。 廚房 (The Kitchen): 代表整個計算機系統。 廚…

筆記本電腦安裝win10哪個版本好_筆記本裝win10專業版圖文教程

筆記本電腦安裝win10哪個版本好&#xff1f;筆記本還是建議安裝win10專業版。Win分為多個版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和專業版&#xff08;Pro&#xff09;是用戶選擇最多的兩個版本。win10專業版在功能以及安全性方面有著明顯的優勢&#xff0c;所…

微服務循環依賴調用引發的血案

問題表現 最近的迭代轉測后遇到了一個比較有意思的問題。在測試環境整體運行還算平穩&#xff0c;但是過一段時間之后&#xff0c;就開始有接口超時了&#xff0c;日志中出現非常多的 “java.net.SocketTimeoutException: Read timed out”。試了幾次重啟大法&#xff0c;每次…

LeetCode - 852. 山脈數組的峰頂索引

題目 852. 山脈數組的峰頂索引 - 力扣&#xff08;LeetCode&#xff09; 思路 使用二分查找來定位峰頂 對于中間元素&#xff0c;比較它與其右側元素的大小&#xff1a; 如果 arr[mid] < arr[mid1]&#xff0c;說明我們在上坡階段&#xff0c;峰頂在右側 如果 arr[mid…

國產ARM/RISCV與OpenHarmony物聯網項目(二)網關數據顯示

本文需要Web服務器開發基礎&#xff0c;可參考下述博文&#xff1a; 物聯網網關Web服務器--lighttpd服務器部署與應用測試 物聯網網關Web服務器--CGI開發接口 一、數據顯示界面與功能設計 1、功能設計說明 程序代碼結構如下&#xff0c;調用關系見彩色部分標示。 數據顯示界面…

Robyn高性能Web框架系列01:Robyn快速入門

Robyn快速入門 安裝 Robyn1、僅安裝基礎 HTTP 路由功能2、帶擴展功能的安裝 第一個Robyn程序1、創建Robyn應用2、Say Hello!3、啟動Robyn應用 Python世界從來不缺少對于性能的追求&#xff0c;Robyn就是其中之一&#xff0c;它將 Python 的異步功能與 Rust 相結合&#xff0c;在…

微信小程序 -----無限新增刪除,同時算出總合算金額。

<view class="refuelMoney-main" style="padding-bottom: 200rpx;"><!-- <view class="add_record">添加加油記錄</view> --><view class="refuel-itemTextArea"><text style="width: 35%;&quo…

linux “Permission Denied“解決方案

Linux 編譯錯誤排查 在軟件開發過程中&#xff0c;編譯錯誤和版本控制問題是開發者每天都會遇到的挑戰。本文將結合實際案例&#xff0c;詳細講解 Linux 環境下常見編譯錯誤的排查方法 權限拒絕錯誤&#xff08;Permission Denied&#xff09; 當執行腳本或程序時&#xff0…

【慧游魯博】【15】后臺管理系統功能完善:儀表盤、多模態交互日志、簡單問答詞條管理

文章目錄 本次更新多模態交互日志效果涉及代碼文件 儀表盤&#xff08;部分&#xff09;效果涉及代碼文件 簡單問答服務詞條管理效果涉及代碼文件 本次更新 代碼真的太多太多了&#xff0c;不放代碼了 多模態交互日志 數據概覽與篩選功能 時間范圍篩選&#xff1a;提供"…

【力扣 簡單 C】21. 合并兩個有序鏈表

目錄 題目 解法一&#xff1a;迭代 解法二&#xff1a;遞歸 題目 解法一&#xff1a;迭代 struct ListNode* merge(struct ListNode* head1, struct ListNode* head2) {struct ListNode* virHead malloc(sizeof(*virHead));struct ListNode* curNode virHead;struct List…

【開源工具】Windows屏幕控制大師:息屏+亮度調節+快捷鍵一體化解決方案

??? 從零打造Windows屏幕控制大師:息屏+亮度調節+快捷鍵一體化解決方案 ?? 個人主頁:創客白澤 - CSDN博客 ?? 系列專欄:??《Python開源項目實戰》 ?? 熱愛不止于代碼,熱情源自每一個靈感閃現的夜晚。愿以開源之火,點亮前行之路。 ?? 希望大家多多支持,我們一…

pyhton基礎【11】函數一

目錄 一.函數說明 二.函數介紹 函數簡介 作用 函數分類 三.自定義函數 定義函數 調用函數 pass關鍵字 定義一次執行多次 一.函數說明 Python中的函數是一個重要的編程概念&#xff0c;它允許編程者封裝代碼塊以實現特定的功能。函數的作用和應用場景非常廣泛&#xf…

使用Kotlin開發后端服務的核心方法

一、開發步驟 選擇框架 Kotlin后端開發常用框架包括Spring Boot、Ktor和Micronaut。Spring Boot生態成熟&#xff0c;適合企業級應用&#xff1b;Ktor輕量且協程友好&#xff0c;適合高性能異步服務&#xff1b;Micronaut以低內存占用和快速啟動見長。 搭建項目結構 通過Grad…

java面試總結-20250616

題目1: 求一個int類型正整數二進制中最高位1的位置&#xff1f; 比如10&#xff0c;二進制位1010&#xff0c;最高位1所在位置位4。 解體思路&#xff1a; 使用高位擴散&#xff0c;將1010擴散位1111使用二分法&#xff0c;計算32位二進制中1111前面0的位數n&#xff1b;結果…

Black自動格式化工具

文章目錄 一、Black自動格式化工具二、格式化行為的核心內容1. 統一縮進和空格規則2. 括號換行&#xff1a;一致的多行結構展開3. 字符串風格統一4. 函數/類定義中的空行規則5. import 排序&#xff08;建議搭配 isort&#xff09;6. 注釋不動、換行優雅7. 可配置項極少&#x…

項目拓展-簡易SQL監控,P6SPY攔截所有jdbc連接并打印執行SQL

介紹一下P6spy驅動 p6spy 是一款開源的數據庫監控框架&#xff0c;主要用于 攔截和記錄應用程序與數據庫之間的所有交互&#xff08;如 SQL 語句、參數、執行時間等&#xff09; 它通過包裝現有的 JDBC 驅動&#xff08;如 MySQL JDBC 驅動&#xff09;&#xff0c;在不修改業…

洛谷B3951 [GESP樣題 五級] 小楊的隊列

題目描述 小楊的班級里共有 N N N 名同學&#xff0c;學號從 0 0 0 至 N ? 1 N-1 N?1。某節課上&#xff0c;老師要求同學們進行列隊。具體來說&#xff0c;老師會依次點名 M M M 名同學&#xff0c;讓他們加入隊伍。每名新入隊的同學需要先站到隊伍末尾&#xff08;剛開…

Java編程之外觀模式

前言 想象你要去一家很復雜的餐廳吃飯&#xff0c;但不想自己點菜、排隊、找位置&#xff0c;也不想管廚房、洗碗、送餐這些后端流程。你只需要告訴餐廳服務員“我要一份牛排套餐”&#xff0c;然后坐等就好。這個服務員&#xff0c;就是外觀模式&#xff08;Facade Pattern&a…