亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用空列創建唯一約束

使用空列創建唯一約束

翻閱古今 2019-07-25 18:45:21
使用空列創建唯一約束我有一個這種布局的表:CREATE TABLE Favorites(   FavoriteId uuid NOT NULL PRIMARY KEY,   UserId uuid NOT NULL,   RecipeId uuid NOT NULL,   MenuId uuid)我想創建一個類似于此的唯一約束:ALTER TABLE FavoritesADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);但是,這將允許多行具有相同的(UserId, RecipeId)if MenuId IS NULL。我想允許NULL在MenuId存儲不具有關聯菜單中的最愛,但我只希望每個用戶/食譜對這些行中最多只有一個。我到目前為止的想法是:使用一些硬編碼的UUID(例如全零)而不是null。但是,MenuId每個用戶的菜單都有一個FK約束,所以我必須為每個用戶創建一個特殊的“空”菜單,這是一個麻煩。使用觸發器檢查是否存在空條目。我認為這是一個麻煩,我喜歡盡可能避免觸發器。另外,我不相信他們能保證我的數據永遠不會處于不良狀態。只需忘記它并檢查中間件或插入函數中是否存在空條目,并且沒有此約束。我正在使用Postgres 9.0。我有什么方法可以忽略嗎?
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

您可以在MenuId上創建一個帶有合并的唯一索引:

CREATE UNIQUE INDEXFavorites_UniqueFavorite ON Favorites(UserId, COALESCE(MenuId, '00000000-0000-0000-0000-000000000000'), RecipeId);

你只需要為COALESCE選擇一個永遠不會出現在現實生活中的UUID。在現實生活中你可能永遠不會看到零UUID,但如果你是偏執狂,你可以添加一個CHECK約束(因為它們真的是為了讓你......):

alter table Favoritesadd constraint check(MenuId <> '00000000-0000-0000-0000-000000000000')


查看完整回答
反對 回復 2019-07-25
  • 3 回答
  • 0 關注
  • 572 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號