Tôi có một bảng với bố cục này:
CREATE TABLE Favorites
(
FavoriteId uuid NOT NULL PRIMARY KEY,
UserId uuid NOT NULL,
RecipeId uuid NOT NULL,
MenuId uuid
)
Tôi muốn tạo một ràng buộc duy nhất tương tự như thế này:
ALTER TABLE Favorites
ADD CONSTRAINT Favorites_UniqueFavorite UNIQUE(UserId, MenuId, RecipeId);
Tuy nhiên, điều này sẽ cho phép nhiều hàng với cùng (UserId, RecipeId)
, nếu MenuId IS NULL
. Tôi muốn cho phép NULL
trong MenuId
để lưu trữ một yêu thích đã không đơn liên quan, nhưng tôi chỉ muốn tối đa là một trong những hàng mỗi cặp người dùng / công thức.
Những ý tưởng tôi có cho đến nay là:
Sử dụng một số UUID được mã hóa cứng (như tất cả các số không) thay vì null.
Tuy nhiên,MenuId
có một ràng buộc FK trên mỗi menu của người dùng, do đó tôi phải tạo một menu "null" đặc biệt cho mọi người dùng, điều này thật rắc rối.Kiểm tra sự tồn tại của một mục rỗng bằng cách sử dụng một kích hoạt thay thế.
Tôi nghĩ rằng đây là một rắc rối và tôi thích tránh kích hoạt bất cứ nơi nào có thể. Ngoài ra, tôi không tin tưởng họ để đảm bảo dữ liệu của tôi không bao giờ ở trạng thái xấu.Chỉ cần quên nó đi và kiểm tra sự tồn tại trước đó của mục nhập null trong kho trung gian hoặc trong chức năng chèn và không có ràng buộc này.
Tôi đang sử dụng Postgres 9.0.
Có phương pháp nào tôi đang xem không?
UserId
,RecipeId
), nếuMenuId IS NULL
?