2016-04-18 21 views
5

Tôi có một bảng trông như thế này:Thêm ràng buộc đặc biệt để tránh các hàng trùng lặp với điều kiện này?

ClientId FloorNum BedNum IsActive 
11  2   212  1   
12  2   214  0   
12  2   214  1   
13  2   215  0   
13  2   215  0   
13  2   215  0   
13  2   215  0   
13  2   215  1   
12  2   215  1   

Như bạn thấy, FloorNum/BedNum kết hợp 2/215 có hai hàng nơi IsActive bằng 1. Điều này không thể xảy ra.

Mặt khác, một FloorNum/BedNum kết hợp có thể có nhiều hàng nơi IsActive bằng 0.

Làm thế nào tôi có thể thêm một hạn chế vào một bảng để một FloorNum/BedNum kết hợp thể chỉ có một hàng nơi IsActive = 1?

Mọi trợ giúp đều được đánh giá cao.

+0

Chúng ta đang nói về loại bàn nào? Đây có phải là Oracle, mySql hay không? Và những giá trị nào bạn muốn là duy nhất? Trong hầu hết các hệ thống cơ sở dữ liệu quan hệ bạn chỉ cần chỉ định một tập hợp các cột là duy nhất. Chẳng hạn như: thay đổi bảng myTable thêm ràng buộc myUniqueConstraint (FloorNum, BedNum, IsActive); – DAC

Trả lời

4

Bạn có thể tạo a filtered unique index với mệnh đề WHERE.

CREATE UNIQUE NONCLUSTERED INDEX IX_[index name]_FloorNum_BedNum ON [myTable] (
    FloorNum ASC, 
    BedNum ASC) 
WHERE (IsActive = 1) 

Điều này sẽ chỉ đưa vào hồ sơ tài khoản nơi cột IsActive được đặt thành 1.

Dựa trên mô tả của bạn tôi nghĩ rằng ClientId là không cần thiết trong ví dụ này nhưng nếu tôi sai, bạn cũng có thể thêm nó vào chỉ mục.

0

Bạn có thể thêm Trigger trên bàn của mình để kiểm tra điều kiện này.

create TRIGGER tr_check_unique ON YourTable 
FOR INSERT 
AS 
    declare @FloorNum int; 
    declare @BedNum int; 

    select @FloorNum=i.FloorNum from inserted i;  
    select @BedNum=i.BedNum from inserted i;  

begin try 
     if exists(select FloorNum ,BedNum from YourTable 
     where [email protected] and [email protected] and IsActive=1) 

     raiserror ('',16,1) 
end try 

begin catch 
raiserror ('record is not unique',16,1) 
end catch 
+0

Điều này sẽ không hoạt động nếu bạn cố gắng chèn nhiều hơn một bản ghi cùng một lúc. – Bridge

Các vấn đề liên quan