Khóa tổng hợp MySQL - kết hợp độc đáo


-1

Giả sử có bảng với các cột abvà với khóa duy nhất tổng hợp từ a,bcặp. Và có hàng a=1, b=2.

Vì vậy, tôi không thể chèn một hàng khác a=1, b=2, đó là ok.

Nhưng làm thế nào tôi có thể từ chối trong tình huống này cũng chèn hàng a=2, b=1?

Ví dụ:

CREATE TABLE `t` (`a` INT, `b` INT); 
ALTER TABLE `t` ADD UNIQUE(`a`, `b`); 
INSERT INTO `t` (`a`, `b`) VALUES ('1', '2'); 
INSERT INTO `t` (`a`, `b`) VALUES ('2', '1');

Chèn thứ hai hoạt động, mặc dù tôi hy vọng nó sẽ thất bại.


Có vẻ như nó hoạt động theo cách tương tự a=2, b=1giống như nó sẽ làm a=1, b=2vì vậy bạn đã có câu trả lời cho câu hỏi này. Điều này có nghĩa là bạn chỉ có thể có 1 bản ghi trong bảng a=2b=1khi nó hoạt động cho a=1b=2cho bản ghi đó - chỉ được phép với một tổ hợp phím duy nhất đó .... Âm thanh như bạn đã kiểm soát được tôi. ... tức là UNIQUE KEY 'uk_ab' ('a','b')điều này sẽ hoạt động tương tự cho CẢ HAI như trong ví dụ của bạn từ câu hỏi của bạn.
Pimp Juice IT

UNIQUE KEY uk_ab (a,b)cho phép chèn a=2,b=1khi a=1,b=2tồn tại :(
Alexey

Đã cập nhật bài viết với ví dụ.
Alexey

Vâng, điều đó nghe có vẻ đúng, nó sẽ cho phép một bản ghi của các giá trị tương tự để âm thanh đó đúng với tôi. a=2,b=1là một bản ghi và a=1,b=2là một bản ghi khác. Bạn chỉ có thể có MỘT bản ghi trong đó mỗi bản ghi là đúng trong đó a và b bằng một số giá trị để hai ví dụ của bạn khác nhau và không giống nhau để điều đó là chính xác. Hãy thử chèn một bản ghi khác trong đó các bản ghi đó lại giống nhau và xác nhận nó đang hoạt động.
Pimp Juice IT

Câu trả lời:


2

Bạn không thể với một định nghĩa khóa / chỉ mục. Từ phối cảnh DB, các giá trị của (1,2) và (2.1) sẽ luôn khác nhau.

Giải pháp sẽ là đảm bảo rằng ví dụ aluôn có giá trị cao hơn bhoặc ngược lại. Bạn có thể đảm bảo điều này trong ứng dụng thêm bản ghi hoặc dưới dạng trình kích hoạt DB.

Xem thêm: Khóa kết hợp độc đáo MySQL có ví dụ về cách thực hiện việc này với trình kích hoạt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.