Ví dụ, đây là một bảng có một khóa chính nhưng không phải là AUTO_INCREMENT
:
mysql> CREATE TABLE foo (
id INT NOT NULL,
PRIMARY KEY (id)
);
mysql> INSERT INTO foo VALUES (1), (2), (5);
Bạn có thể MODIFY
cột để xác định lại nó với AUTO_INCREMENT
tùy chọn:
mysql> ALTER TABLE foo MODIFY COLUMN id INT NOT NULL AUTO_INCREMENT;
Xác nhận này có có hiệu lực:
mysql> SHOW CREATE TABLE foo;
Kết quả:
CREATE TABLE foo (
`id` INT(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1
Lưu ý rằng bạn đã sửa đổi định nghĩa cột tại chỗ, mà không yêu cầu tạo cột thứ hai và thả cột gốc. Ràng buộc PRIMARY KEY
không bị ảnh hưởng và bạn không cần phải đề cập trong câu lệnh ALTER TABLE
.
Tiếp theo, bạn có thể kiểm tra rằng một chèn tạo ra một giá trị mới:
mysql> INSERT INTO foo() VALUES(); -- yes this is legal syntax
mysql> SELECT * FROM foo;
Đầu ra:
+----+
| id |
+----+
| 1 |
| 2 |
| 5 |
| 6 |
+----+
4 rows in set (0.00 sec)
tôi thử nghiệm này trên MySQL 5.0.51 trên Mac OS X.
tôi cũng được thử nghiệm với ENGINE=InnoDB
và một bảng phụ thuộc. Sửa đổi định nghĩa cột id
không làm gián đoạn tính toàn vẹn tham chiếu.
Để trả lời lỗi 150 bạn đã đề cập trong nhận xét, có thể là xung đột với các ràng buộc khóa ngoại. Lời xin lỗi của tôi, sau khi tôi thử nghiệm nó tôi nghĩ rằng nó sẽ làm việc. Dưới đây là một vài liên kết có thể giúp chẩn đoán các vấn đề:
Wow, rất đẹp, cảm ơn một tấn. Nó làm việc mà không có một xô đẩy trên một trong các bảng của tôi. Nhưng một bảng thứ hai, tôi nhận được lỗi này ... Lỗi khi đổi tên '. \ DBNAME \ # sql-6c8_62259c' thành '. \ DBNAME \ dealer_master_events' (errno: 150) –
cảm ơn aloat. bạn cứu tôi. cảm ơn –
nếu khóa chính đã hoạt động như một khóa ngoại ở một nơi khác, bạn sẽ cần vô hiệu hóa kiểm tra khóa ngoài trước khi bạn chạy truy vấn bảng thay đổi. 'set foreign_key_checks = 0; ALTER TABLE người mua MODIFY COLUMN _id INT NOT NULL AUTO_INCREMENT; đặt foreign_key_checks = 1; ' –