2012-01-14 17 views
155

Tôi có một bảng gọi là provider. Tôi có ba cột được gọi là person, place, thing. Có thể có những người trùng lặp, địa điểm trùng lặp và những thứ trùng lặp, nhưng không bao giờ có thể là sự kết hợp giữa hai người-nơi-sự vật.ALTER TABLE để thêm một khóa chính composite

Làm cách nào để tôi thêm BẢNG để thêm khóa chính kết hợp cho bảng này trong MySQL bằng ba cột này?

Trả lời

340
ALTER TABLE provider ADD PRIMARY KEY(person,place,thing); 

Nếu một khóa chính đã tồn tại sau đó bạn muốn làm điều này

ALTER TABLE provider DROP PRIMARY KEY, ADD PRIMARY KEY(person, place, thing); 
+2

này cho biết thêm ba PKS độc đáo, không ai pk composite. – David542

+13

@ David542 Không có - bạn chỉ có thể có 1 khóa chính. –

+28

@David: đó là một khóa chính bao gồm nhiều trường, còn gọi là khóa tổng hợp. –

14

Bạn chỉ có thể muốn có một hạn chế duy nhất. Đặc biệt nếu bạn đã có chìa khóa thay thế. (ví dụ: một AUTO_INCREMENT) câu trả lời

ALTER TABLE `MyDatabase`.`Provider` 
    ADD CONSTRAINT CK_Per_Place_Thing_Unique UNIQUE (person,place,thing) 
; 
+0

Cảm ơn bạn, một hạn chế là những gì tôi muốn, tôi không biết phải hỏi gì trong bài đăng đầu tiên này. Cảm ơn bạn đã thêm chủ đề này vào chuỗi. – ZaneDarken

+0

Tôi thường sử dụng khóa thay thế ...... sau đó thêm một ràng buộc duy nhất. Bằng cách này .... nếu "độc đáo" thay đổi xuống đường, nó không phải là nhiều bộ phim truyền hình để tinh chỉnh các hạn chế, vs rối tung với khóa chính. Và nếu bạn có bảng con tham chiếu khóa ngoài bảng này, bạn chỉ phải FK khóa thay thế, không phải tất cả 3 cột. - - – granadaCoder

3
alter table table_name add primary key (col_name1, col_name2); 
0

ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

16

@Adrian Cornish là đúng. Tuy nhiên, có một thông báo khác để xóa một khóa chính hiện có. Nếu khóa chính đó đang được sử dụng như một khoá ngoại bởi một bảng khác, bạn sẽ gặp lỗi khi cố gắng thả nó. Trong một số phiên bản của mysql được thông báo lỗi có bị thay đổi (tính đến 5.5.17, thông báo lỗi này vẫn

alter table parent drop column id; 
ERROR 1025 (HY000): Error on rename of 
'./test/#sql-a04_b' to './test/parent' (errno: 150). 

Nếu bạn muốn thả một khóa chính đó là được tham khảo bởi bảng khác, bạn sẽ phải thả là phím nước ngoài trong đó bảng khác đầu tiên. bạn có thể tái tạo mà chính nước ngoài nếu bạn vẫn muốn nó sau khi bạn tạo lại khóa chính.

Ngoài ra, khi sử dụng các phím composite, trật tự là rất quan trọng. những

1) ALTER TABLE provider ADD PRIMARY KEY(person,place,thing); 
and 
2) ALTER TABLE provider ADD PRIMARY KEY(person,thing,place); 

không phải là điều tương tự. Cả hai đều thực thi tính duy nhất trên bộ ba trường đó, tuy nhiên từ quan điểm lập chỉ mục thì có sự khác biệt. Các trường được lập chỉ mục từ trái sang phải. Ví dụ, hãy xem xét các truy vấn sau đây:

A) SELECT person, place, thing FROM provider WHERE person = 'foo' AND thing = 'bar'; 
B) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz'; 
C) SELECT person, place, thing FROM provider WHERE person = 'foo' AND place = 'baz' AND thing = 'bar'; 
D) SELECT person, place, thing FROM provider WHERE place = 'baz' AND thing = 'bar'; 

B có thể sử dụng chỉ số khóa chính trong ALTER tuyên bố 1
A có thể sử dụng chỉ số khóa chính trong câu lệnh ALTER 2
C có thể sử dụng một trong hai chỉ số
D không thể sử dụng chỉ mục

A sử dụng hai trường đầu tiên trong chỉ mục 2 làm chỉ mục một phần. A không thể sử dụng chỉ mục 1 vì nó không biết phần vị trí trung gian của chỉ mục. Nó vẫn có thể sử dụng một chỉ số một phần trên người chỉ mặc dù.

D không thể sử dụng chỉ mục vì chỉ số này không biết người.

Xem tài liệu mysql here để biết thêm thông tin.

1

It `s chắc chắn tốt hơn để sử dụng COMPOSITE UNIQUE KEY, như @GranadaCoder cung cấp, một chút ví dụ phức tạp mặc dù:

ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);