Chèn khóa chính tăng tự động vào bảng hiện có


157

Tôi đang cố gắng thay đổi một bảng không có khóa chính cũng như cột auto_increment. Tôi biết cách thêm cột khóa chính nhưng tôi tự hỏi liệu có thể tự động chèn dữ liệu vào cột khóa chính khô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 thủ công) . Có suy nghĩ gì không? Cảm ơn rất nhiều.


2
Bạn có thể dễ dàng thực hiện alter tableđể 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 ở phần bù bên phải - nó mặc định là '1' và dù sao bạn cũng sẽ gặp phải lỗi trùng lặp.
Marc B

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

Câu trả lời:


253

Một ALTER TABLEtuyên bố thêm PRIMARY KEYcột 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 cho mục đích thử nghiệm, câu lệnh trên đã tạo AUTO_INCREMENT idcột và chèn các giá trị tăng tự động cho mỗi hàng hiện có trong bảng, bắt đầu bằng 1.


1
Đúng, đây là kinh nghiệm của tôi. Không bao giờ nhớ phải chạy một tập lệnh riêng biệt để điền vào id id_increment ...
Mike Purcell

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

53
Để biến nó thành cột đầu tiên, hãy sử dụng FIRSTví dụALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
Cơ chế của @Nikkie SQLite khá khác nhau. Bạn sẽ tìm thấy các đề xuất ở đây stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma Nếu bạn đã tạo hàng với tự động tăng và phải truy xuất nó bằng id ngay lập tức, MySQL cung cấp LAST_INSERT_ID()cho giá trị đó SELECT * FROM table_name WHERE id = LAST_INSERT_ID()và hầu hết các API ngôn ngữ lập trình cung cấp một số hàm / phương thức để trả về giá trị đó trong mã ứng dụng.
Michael Berkowski

51

giả sử bạn không có cột để tăng tự động như id, không, thì bạn có thể thêm bằng cách sử dụng truy vấn sau:

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

Nếu bạn đã cột, sau đó thay đổi thành tăng tự động bằng truy vấn sau:

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

1
Làm gì FIRSTlúc kết thúc không?
Mất trí nhớ

1
Nó sẽ làm cho idcột mới trở thành cột đầu tiên trong bảng chứ không phải cuối cùng, đó là hành vi mặc định.
fmalina

Làm việc tốt Cảm ơn!
Majedur Rahaman

4

vâng, 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 một 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 các any_fieldbạn chọn phải giống nhau khi cập nhật.


4

Đối với những người như tôi nhận được một Multiple primary key definedlỗi, hãy thử:

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

Trên MySQL v5.5.31, điều này đặt idcột làm khóa chính cho tôi và điền vào mỗi hàng với giá trị tăng dần.


2

Cách dễ nhất và nhanh nhất tôi tìm thấy là đâ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ể điều chỉnh các hướng dẫn này lấy một bảng có khóa chính không tăng hiện có và thêm khóa chính tăng dần vào bảng và tạo khóa chính hỗn hợp mới với cả khóa cũ và khóa mới làm khóa chính tổng hợp bằng cách sử dụng sau mã:

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ả cá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 đi chạy lại để thử nghiệm các biến thể.

Điều tôi chưa thể làm việc là tình huống có các phím NGOẠI TỆ đang đến chỉ vào trường USER_ID. Tôi nhận được thông báo này khi tôi cố gắng thực hiện một ví dụ phức tạp hơn với khóa ngoại đế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 khó 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.


0

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


0

Bạn có thể thêm một cột Khóa chính mới vào một 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 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
dùng1717828

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ỏ trường cho khóa chính sau đó tôi tạo lại nó và đảm bảo rằng nó là tự động tăng dần. Điều đó làm việc cho tôi. Tôi hy vọng nó sẽ giúp người khác


0

ALTER TABLE tableName MODIFY tableNameID MEDIUMINT KHÔNG NULL AUTO_INCREMENT ;

Dưới đây tableName là tên của bảng của bạn,

tableName là tên cột của bạn mà là chính đã được sửa đổi

MEDIUMINT là kiểu dữ liệu của khóa chính hiện tại của bạn

AUTO_INCREMENT bạn phải thêm chỉ auto_increment sau khi không null

Nó sẽ làm cho khóa chính auto_increment đó ......

Hy vọng điều này là hữu ích :)


1
Sẽ hữu ích nếu bạn chỉnh sửa và thêm một số giải thích.
Shashanth

-1

Làm thế nào để viết PHP vào ALTER trường đã có (tên, trong ví dụ này) để biến nó thành khóa chính? Tất nhiên, sẽ thêm bất kỳ trường 'id' bổ sung nào vào bảng ..

Đây là bảng hiện được tạo - Số lượng bản ghi được tìm thấy: 4 tên VARCHAR (20) CÓ giống VARCHAR (30) CÓ màu VARCHAR (20) CÓ trọng lượng SMALLINT (7) CÓ

Đây là kết quả cuối cùng được tìm kiếm (MÔ TẢ BẢNG) -

Số lượng hồ sơ được tìm thấy: 4 tên VARCHAR (20) KHÔNG PRI giống VARCHAR (30) CÓ màu VARCHAR (20) CÓ trọng lượng SMALLINT (7) CÓ

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

Số lượng hồ sơ được tìm thấy: 5 id int (11) KHÔNG CÓ tên PRI VARCHAR (20) CÓ giống VARCHAR (30) CÓ màu VARCHAR (20) CÓ trọng lượng SMALLINT (7) CÓ

sau khi thử ..

$ query = "ALTER TABLE ngựa đua THÊM id id KHÔNG NULL AUTO_INCREMENT ĐẦU TIÊN, THÊM KHÓA CHÍNH (id)";

Làm thế nào để có được điều này? -

Số lượng hồ sơ được tìm thấy: 4 tên VARCHAR (20) KHÔNG PRI giống VARCHAR (30) CÓ màu VARCHAR (20) CÓ trọng lượng SMALLINT (7) CÓ

tức là CHERTN / THÊM .. vv khóa chính VÀO bản ghi trường đầu tiên (w / o thêm trường 'id' bổ sung, như đã nêu trước đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.