2012-01-30 63 views
128

Tôi đang cố gắng thay đổi bảng không có cột chính cũng như cột auto_increment. Tôi biết làm thế nào để thêm một cột khóa chính nhưng tôi đã tự hỏi nếu nó có thể chèn dữ liệu vào cột khóa chính tự động (tôi đã có 500 hàng trong DB và muốn cung cấp cho họ id nhưng tôi không muốn làm điều đó bằng tay) . Có suy nghĩ gì không? Cảm ơn rất nhiều.Chèn khóa chính tăng tự động vào bảng hiện có

+2

Bạn có thể dễ dàng thực hiện 'thay đổi bảng' để thêm khóa, nhưng MySQL sẽ không tạo ID cho các trường chưa có chúng. Bạn sẽ phải cập nhật thủ công các trường hiện có và sau đó đảm bảo auto_increment mới của bạn bắt đầu ở độ lệch bên phải - giá trị mặc định là '1' và bạn chỉ cần kết thúc với các lỗi khóa trùng lặp. –

+2

@MarcB Tôi vừa thử nghiệm và thực tế đã chèn các id cho các hàng hiện tại bắt đầu từ 1 –

Trả lời

206

Một ALTER TABLE tuyên bố thêm cột PRIMARY KEY hoạt động chính xác trong thử nghiệm của tôi:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT; 

Trên một bảng tạm thời được tạo ra cho mục đích thử nghiệm, tuyên bố trên tạo ra các giá trị tự động tăng AUTO_INCREMENTid cột và chèn vào cho mỗi hiện hàng trong bảng, bắt đầu với 1.

+1

Đúng, đây là trải nghiệm của tôi. Không bao giờ nhớ phải chạy một tập lệnh riêng để điền id auto_increment ... –

+1

lol..Cảm ơn. lỗi của tôi. Dấu màu xanh lá cây dành cho bạn vì bạn sẽ dễ thực hiện hơn. : D – FlyingCat

+0

+1, hoạt động trong 5.1.51-ndb-7.1.9a-log, trên bảng với công cụ MyISAM –

3

có, một cái gì đó như thế này sẽ làm điều đó, có thể không phải là tốt nhất, mặc dù bạn có thể muốn tạo bản sao lưu

$get_query = mysql_query("SELECT `any_field` FROM `your_table`"); 

$auto_increment_id = 1; 

while($row = mysql_fetch_assoc($get_query)) 
{ 
    $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'"); 
    $auto_increment_id++; 
} 

lưu ý rằng số any_field bạn chọn phải giống nhau khi cập nhật.

+0

một điều tốt. Cảm ơn. – FlyingCat

2

Đối với những người như bản thân tôi nhận được một thử Multiple primary key defined lỗi:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL; 

On MySQL v5.5.31 này thiết lập các cột id làm khóa chính cho tôi và dân cư mỗi hàng với giá trị incrementing.

34

giả sử bạn không có cột cho increment tự như id, không, sau đó bạn có thể thêm bằng truy vấn sau đây:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST 

Nếu bạn cột đã, sau đó thay đổi để tự động tăng sử dụng truy vấn sau đây:

ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY 
+1

'FIRST' cuối cùng là gì? – Dementic

+1

Nó sẽ làm cho cột 'id' mới đầu tiên trong bảng trái ngược với cuối cùng, đó là hành vi mặc định. –

3

Các dễ nhất và nhanh nhất tôi thấy là thế này

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated, 
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC); 
2

tôi đã có thể thích nghi với những ins các phiên đấu giá có một khóa có số chính là hiện tại không chính xác và thêm khóa chính gia tăng vào bảng và tạo khóa chính mới kết hợp với cả khóa cũ và mới làm khóa chính kết hợp sử dụng mã sau:

DROP TABLE IF EXISTS SAKAI_USER_ID_MAP; 

CREATE TABLE SAKAI_USER_ID_MAP (
     USER_ID    VARCHAR (99) NOT NULL, 
     EID     VARCHAR (255) NOT NULL, 
     PRIMARY KEY (USER_ID) 
); 

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin'); 
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster'); 

ALTER TABLE SAKAI_USER_ID_MAP 
    DROP PRIMARY KEY, 
    ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
    ADD PRIMARY KEY (_USER_ID, USER_ID); 

Khi điều này được thực hiện, trường _USER_ID tồn tại và có tất cả giá trị số cho khóa chính chính xác như bạn mong đợi. Với "DROP TABLE" ở trên cùng, bạn có thể chạy lặp đi lặp lại để thử nghiệm với các biến thể.

Điều tôi chưa thể làm việc là tình huống có các khóa NGOẠI HỐI đến đã trỏ vào trường USER_ID. Tôi nhận được thông báo này khi tôi cố gắng làm một ví dụ phức tạp hơn với một khóa lạ đến từ một bảng khác.

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150) 

Tôi đoán rằng tôi cần phải xé tất cả các khóa ngoài trước khi thực hiện bảng ALTER và sau đó xây dựng lại chúng sau đó. Nhưng bây giờ tôi muốn chia sẻ giải pháp này cho một phiên bản thử thách hơn của câu hỏi ban đầu trong trường hợp những người khác gặp phải tình huống này.

1

Xuất bảng của bạn, sau đó làm trống bảng, sau đó thêm trường làm INT duy nhất, sau đó thay đổi thành AUTO_INCREMENT, sau đó nhập lại bảng của bạn mà bạn đã xuất trước đó.

-1

Làm thế nào để viết PHP để ALTER trường đã tồn tại (tên, trong ví dụ này) để làm cho nó một khóa chính? W/o, tất nhiên, thêm bất kỳ trường 'id' bổ sung nào vào bảng ..

Bảng này hiện được tạo - Số lượng hồ sơ được tìm thấy: 4 tên VARCHAR (20) CÓ giống VARCHAR (30) YES màu VARCHAR (20) YES cân SMALLINT (7) YES

này một kết quả cuối cùng đã tìm (BẢNG MÔ tẢ) -

số hồ sơ tìm thấy 4 tên VARCHAR (20) NO PRI giống VARCHAR (30) CÓ VARCHAR màu (20) CÓ trọng lượng NHỎ (7) CÓ

Thay vì nhận được này -

Số ghi tìm thấy: 5 id int (11) NO PRI tên VARCHAR (20) YES giống VARCHAR (30) YES màu VARCHAR (20) YES cân SMALLINT (7) YES

sau khi thử ..

$ query = "ALTER TABLE ADD ngựa đua id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)";

làm cách nào để có được điều này? -

Số hồ sơ tìm thấy 4 tên VARCHAR (20) NO PRI giống VARCHAR (30) YES màu VARCHAR (20) YES cân SMALLINT (7) YES

tức INSERT/ADD .. vv khóa chính INTO bản ghi trường đầu tiên (w/o thêm trường 'id' bổ sung, như đã nêu trước đó.

0

Bạn có thể thêm một cột Khóa chính mới vào bảng hiện có, có thể có số thứ tự, sử dụng lệnh:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 
0

Tôi đã phải đối mặt với cùng một vấn đề vì vậy những gì tôi đã làm tôi bỏ lĩnh vực cho khóa chính sau đó tôi tái tạo nó và chắc chắn rằng nó là tự động gia tăng. Điều đó làm việc cho tôi. Tôi hy vọng nó sẽ giúp người khác

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