2011-02-10 43 views
11

Tôi đang cố gắng tạo một ràng buộc UNIQUE INDEX cho hai cột, nhưng chỉ khi một cột khác chứa giá trị 1. Ví dụ: column_1column_2 chỉ nên là UNIQUE khi active = 1 . Bất kỳ hàng nào chứa active = 0 đều có thể chia sẻ giá trị cho column_1column_2 với một hàng khác, bất kể giá trị của hàng khác cho active là gì. Nhưng các hàng nơi active = 1 không thể chia sẻ giá trị của column_1 hoặc column_2 với một hàng khác có active = 1.Ràng buộc UNIQUE, chỉ khi một trường có chứa giá trị cụ thể

Ý tôi là "chia sẻ" là hai hàng có cùng (các) giá trị trong cùng một cột. Ví dụ: row1.a = row2.a AND row1.b = row2.b. Giá trị sẽ chỉ được chia sẻ nếu cả hai cột trong hàng1 khớp với hai cột khác trong hàng2.

Tôi hy vọng tôi đã tự làm rõ. : \

Trả lời

0

chỉ mục bất khả tri về ảnh hưởng bên ngoài. Loại ràng buộc này sẽ phải được thực hiện bên ngoài cơ sở dữ liệu của bạn.

0

Trong SQL Server, điều này có thể được thực hiện với các ràng buộc kiểm tra, tuy nhiên tôi không biết liệu MySQL có hỗ trợ bất kỳ thứ gì tương tự hay không.

Điều gì sẽ hoạt động trên bất kỳ cơ sở dữ liệu nào, là bạn có thể chia bảng thành hai. Nếu các bản ghi trong đó active = 0 chỉ là các bản ghi lịch sử, và sẽ không bao giờ trở nên hoạt động trở lại, bạn chỉ có thể di chuyển chúng sang một bảng khác, và thiết lập ràng buộc duy nhất đơn giản trên bảng gốc.

+0

Tôi nhận được đề xuất tương tự về IRC; tạo một bảng hoạt động và một bảng không hoạt động. Nhưng chúng theo cách bạn đặt nó có ý nghĩa hơn; có một bảng lịch sử và một bảng hoạt động. Tuy nhiên, bảng này có rất nhiều lĩnh vực và nó có vẻ như nhân đôi các lĩnh vực thành hai bảng sẽ là điều sai trái để làm. Làm thế nào bạn đề nghị tôi tránh loại dư thừa này? – Sam

+0

Một chút không chuẩn hóa có thể đi một chặng đường dài, vì vậy đừng lo lắng về các định nghĩa trùng lặp. Tất nhiên, bạn sẽ phải thực hiện bất kỳ thay đổi nào đối với bảng gốc đối với bảng lịch sử, do đó, đó là một số chi phí, nhưng, IMHO nó cũng đáng giá dữ liệu sạch. – SWeko

+0

Hmm, nếu tôi chỉ tách riêng dữ liệu cần lập chỉ mục duy nhất thì sao? Các bảng: mydata, mydata_active, mydata_inactive. Bằng cách này, dữ liệu mydata chứa các cột chính và cột dữ liệu.Và, mydata_active và mydata_inactive sẽ chỉ chứa các cột cần được lập chỉ mục duy nhất và Khóa ngoài tham chiếu mydata. Đây là một cách khác, nhưng nó đòi hỏi thêm một bảng (thứ ba). – Sam

11

Bạn có thể thử tạo chỉ mục UNIQUE đa cột với cột_1, cột_2 và hoạt động, sau đó đặt hoạt động = NULL cho các hàng không yêu cầu tính duy nhất. Ngoài ra, bạn có thể sử dụng trình kích hoạt (see MySQL trigger syntax) và kiểm tra từng hàng được chèn/cập nhật nếu các giá trị đó đã có trong bảng - nhưng tôi nghĩ nó sẽ khá chậm.

+0

Tôi khuyên bạn nên giải pháp NULL - thật dễ dàng, NULL loại bằng FALSE (chỉ không nói điều đó với SQLer chính thống), và tốt nhất là làm cho cơ sở dữ liệu của bạn làm tất cả công việc cho bạn. –

+0

Trong giải pháp NULL, cơ sở dữ liệu phân biệt sự độc đáo của 2 hàng trong tình huống khi chúng giống hệt nhau như thế nào? Liệu mysql có tránh hạn chế kiểm tra tại thời điểm đó không? –

2

Tôi đang cố gắng để tạo ra một INDEX chế UNIQUE cho hai cột, nhưng chỉ khi cột khác chứa giá trị 1

Bạn có thể thiết lập giá trị của "một cột" một giá trị duy nhất không bằng 1. ví dụ id của bản ghi.

Sau đó, ràng buộc chỉ mục duy nhất có thể được áp dụng cho cả ba cột bao gồm cả "cột khác". Hãy gọi cột "cột khác" X. Đặt giá trị của cộtX thành 1 nếu bạn muốn áp dụng ràng buộc duy nhất cho bản ghi. Đặt giá trị của cộtX thành một giá trị duy nhất nếu bạn không muốn áp dụng ràng buộc duy nhất.

Sau đó, không cần thêm công việc/trình kích hoạt. Chỉ mục duy nhất cho cả ba cột có thể giải quyết vấn đề của bạn.

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