2008-10-30 33 views
51

Tôi đã mua một cơ sở dữ liệu từ một nhà phát triển khác. Anh ta không sử dụng auto_incrementers trên bất kỳ bảng nào. Tất cả chúng đều có ID khóa chính, nhưng anh ta đã làm tất cả việc gia tăng theo cách thủ công, bằng mã.tạo ID trong bảng mysql auto_increment (sau thực tế)

Tôi có thể biến những người đó thành Auto_incrementers ngay bây giờ không?


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'

Trả lời

96

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 đề:

+0

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) –

+1

cảm ơn aloat. bạn cứu tôi. cảm ơn –

+0

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; ' –

-1

Miễn là bạn có số nguyên duy nhất (hoặc một số duy nhất giá trị) trong PK hiện tại, bạn có thể tạo một bảng mới và chèn vào nó với IDENTITY INSERT ON. Sau đó thả bảng cũ và đổi tên bảng mới.

Đừng quên tạo lại bất kỳ chỉ mục nào.

+0

Tùy chọn đó dành riêng cho Microsoft SQL Server và nó không có liên quan đến MySQL. –

0

Có, dễ dàng. Chỉ cần chạy truy vấn định nghĩa dữ liệu để cập nhật các bảng, thêm cột AUTO_INCREMENT.

Nếu bạn có cơ sở dữ liệu hiện có, hãy cẩn thận để giữ lại bất kỳ mối quan hệ khóa ngoài nào có thể đã có trên khóa chính "tạo giả tạo".

4

Tôi đoán rằng bạn không cần phải tăng lại dữ liệu hiện có, vậy tại sao bạn không thể chạy lệnh ALTER TABLE đơn giản để thay đổi thuộc tính của PK?

Cái gì như:

ALTER TABLE `content` CHANGE `id` `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT 

Tôi đã kiểm tra mã này trên cơ sở dữ liệu MySQL của riêng tôi và nó hoạt động nhưng tôi đã không thử nó với bất kỳ số ý nghĩa của hồ sơ. Khi bạn đã thay đổi hàng thì bạn cần đặt lại số gia tăng thành số được đảm bảo không can thiệp vào bất kỳ bản ghi nào khác.

ALTER TABLE `content` auto_increment = MAX(`id`) + 1 

Một lần nữa, chưa được kiểm tra nhưng tôi tin rằng nó sẽ hoạt động.

4

Không có ở trên làm việc cho bàn của tôi. Tôi có một bảng với một số nguyên không dấu là khóa chính với các giá trị từ 0 đến 31543. Hiện tại có hơn 19 nghìn bản ghi. Tôi đã phải sửa đổi cột thành AUTO_INCREMENT (MODIFY COLUMN 'id' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT) và đặt hạt giống (AUTO_INCREMENT = 31544) trong cùng một tuyên bố.

ALTER TABLE `'TableName'` MODIFY COLUMN `'id'` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 31544; 
2

này đã làm việc cho tôi (tôi muốn làm cho chính id và thiết lập tự động tăng)

ALTER TABLE table_name ĐỔI idid INT PRIMARY KEY AUTO_INCREMENT;

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