2010-04-15 54 views
18

Tôi đang cố gắng tìm hiểu cách sử dụng khóa và để phá vỡ thói quen nhất thiết phải có SERIAL ID loại cho tất cả các hàng trong tất cả các bảng của tôi. Đồng thời, tôi cũng đang làm nhiều mối quan hệ, và do đó đòi hỏi các giá trị duy nhất trên một trong hai cột của các bảng phối hợp các mối quan hệ sẽ cản trở điều đó.Khóa chính nhiều cột trong MySQL 5

Làm cách nào để xác định khóa chính trên bảng sao cho có thể lặp lại bất kỳ giá trị đã cho nào trong bất kỳ cột nào, miễn là kết hợp giá trị trên tất cả các cột không bao giờ được lặp lại chính xác?

+0

Bản sao có thể có của [Cách tạo đúng các khóa chính kết hợp - MYSQL] (http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql) –

+0

Không thể là bản sao của nội dung được đăng sau 3 năm. – Kaji

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha ;-) –

Trả lời

39

trích dẫn từ trang CREATE TABLE Syntax:

một khóa chính có thể là một nhiều cột chỉ mục. Tuy nhiên, bạn không thể tạo chỉ mục nhiều cột bằng cách sử dụng thuộc tính khóa PRIMARY KEY trong một đặc điểm cột. Làm như vậy chỉ đánh dấu rằng cột đơn đó là chính. Bạn phải sử dụng mệnh đề PRIMARY KEY (index_col_name, ...) riêng biệt.

Something như thế này có thể được sử dụng cho khóa chính nhiều cột:

CREATE TABLE 
    product (
     category INT NOT NULL, 
     id INT NOT NULL, 
     price DECIMAL, 
     PRIMARY KEY(category, id) 
    ); 

Từ 13.6.4.4. FOREIGN KEY Constraints

+0

Shouldn ' bạn có bao gồm giá trong PK (danh mục, id, giá) của ví dụ của bạn không? Anh ấy yêu cầu 'bất kỳ cột' và 'trên tất cả các cột'? ... và sau đó thêm một bình luận nghiêm khắc về điều này là tối ưu, chậm và không bao giờ cần thiết trong cuộc sống thực? (CÓ! Tôi đang đánh bạc ở đây :-) – lexu

+0

Tôi đồng ý. Tất cả các cột nên ở đó – fiacobelli

+0

Không hoạt động ở tất cả trong trường hợp của tôi. Ví dụ: nếu tôi sử dụng danh mục khác, nhưng cùng một id, vẫn hiển thị cho tôi khóa trùng lặp. –

17

Tiểu học trọng điểm là một khái niệm tên miền duy nhất (nhất thiết và đủ) xác định đối tượng của bạn trong số các thực thể tương tự. Khóa chính kết hợp (nhiều cột) chỉ có ý nghĩa khi một phần của khóa đề cập đến một cá thể cụ thể của một thực thể tên miền khác.

Giả sử bạn có một bộ sưu tập sách cá nhân. Miễn là bạn ở một mình, bạn có thể đếm chúng và gán cho mỗi số. Số này là khóa chính của miền của thư viện của bạn.

Bây giờ bạn muốn hợp nhất thư viện của mình với thư viện của người hàng xóm nhưng vẫn có thể phân biệt được một cuốn sách thuộc về ai. Tên miền bây giờ rộng hơn và khóa chính bây giờ là (owner, book_id).

Vì vậy, làm cho mỗi tổng hợp khóa chính không phải là chiến lược của bạn, mà đúng hơn là bạn nên sử dụng nó khi cần.

Bây giờ, một số thông tin về MySQL. Nếu bạn định nghĩa một khóa chính hỗn hợp và muốn RDBSM tự động hóa các id cho bạn, bạn nên biết về sự khác biệt giữa hành vi MyISAM và InnoDB.

Giả sử chúng tôi muốn một bảng có hai trường: parent_id, child_id. Và chúng tôi muốn child_id được autoincremented.

MyISAM sẽ tự động hợp nhất trong hồ sơ với cùng parent_id và InnoDB sẽ tự động phân tách duy nhất trong toàn bộ bảng.

Trong MyISAM, bạn nên xác định khóa chính là (parent_id, child_id), và trong InnoDB là (child_id, parent_id), vì trường tự động tăng phải là thành phần ngoài cùng bên trái trong khóa chính trong InnoDB.

+1

Đây là câu trả lời nổi bật. – Dakatine

1

Khóa chính là giá trị duy nhất cho hàng. Nó không có ý nghĩa bao gồm giá cả, một giá trị có thể thay đổi. Hãy tưởng tượng nếu bạn phải thay đổi một phạm vi giá lớn, thì tất cả những giá trị khóa chính sẽ thay đổi. Thật là một mớ hỗn độn!

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