2009-07-20 59 views
21

Ngay bây giờ, tôi có một bảng có khóa chính là một trường auto_increment. Tuy nhiên, tôi cần đặt khóa chính là username, date (để đảm bảo rằng không thể có tên người dùng trùng lặp có ngày). Tuy nhiên, cần có trường auto_increment để thay đổi thông tin hàng (thêm và xóa).Tôi cần phải auto_increment một trường trong MySQL mà không phải là khóa chính

Điều gì thường được thực hiện với tình huống này?

Cảm ơn!

Trả lời

16

Chỉ cần đặt chỉ mục duy nhất trên tổng hợp (tên người dùng, ngày).

ALTER TABLE `table` ADD UNIQUE INDEX `name` (`username`, `date`); 

Ngoài ra, bạn có thể thử

ALTER TABLE `table` DROP PRIMARY KEY, ADD PRIMARY KEY(`username`,`date`); 

và tôi nghĩ rằng trong trường hợp thứ hai bạn cần những cột được khai báo NOT NULL.

+0

làm điều đó, cảm ơn! – littleK

+0

@littleK tôi có hai lĩnh vực tôi muốn đặt một là khóa chính và khác như là một tăng tự động là nó có thể? –

1

Thay đổi khóa chính hiện tại của bạn là một chìa khóa duy nhất thay vì:

ALTER TABLE table DROP PRIMARY KEY, ADD UNIQUE KEY(username,date); 

Các auto_increment sẽ hoạt động bình thường sau đó không có bất kỳ vấn đề. Bạn cũng nên đặt một phím duy nhất trên lĩnh vực auto_increment là tốt, để sử dụng cho việc xử lý hàng của bạn:

ALTER TABLE table ADD UNIQUE KEY(id); 
+0

Tôi đã cố gắng thực hiện theo cách này, tuy nhiên vẫn gặp lỗi: # 1075 - Định nghĩa bảng không chính xác; chỉ có thể có một cột tự động và cột này phải được xác định là khóa – littleK

1

Sử dụng một cái gì đó như:

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT, 
    user VARCHAR(32) NOT NULL, 
    thedate DATE NOT NULL, 
    UNIQUE(user,thedate) 
); 

Nếu bạn đã có bàn, và chỉ muốn thêm một hạn chế duy nhất trên sử dụng + thedate, chạy

ALTER TABLE users ADD UNIQUE KEY user_date_idx (user, thedate); 
1

tôi biết đây là câu hỏi cũ, đây là cách tôi giải quyết vấn đề -

ALTER TABLE `student_info` ADD `sn` INT(3) UNIQUE NOT NULL AUTO_INCREMENT FIRST   
+0

Giải pháp hữu ích, cảm ơn bạn! –

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