Làm cách nào để thêm khóa chính vào bảng MySQL?


103

Đây là những gì tôi đã thử nhưng nó không thành công:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

Có ai có một mẹo?


11
Khi một cái gì đó không thành công , luôn luôn là một ý tưởng tốt để xác định những gì không thành công có nghĩa là: bạn có nhận được thông báo lỗi không? cái nào ?
Pascal MARTIN

Tôi đoán vẻ thông báo lỗi như: nhiều primarys chính được xác định
LMD

Câu trả lời:


226

Sau khi thêm cột, bạn luôn có thể thêm khóa chính:

ALTER TABLE goods ADD PRIMARY KEY(id)

Về lý do tại sao tập lệnh của bạn không hoạt động, bạn cần xác định PRIMARY KEYchứ không chỉ từ PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Đối với tôi, nó nói: điều này sẽ xác định nhiều khóa chính. Tôi đang sử dụng InnoDB. Lưu ý rằng tôi đã có 3 trong số họ.
LMD

2
Tôi chắc chắn sẽ đặt FIRSTsau AUTO_INCREMENT, có nghĩa là idcột đầu tiên của bảng đã tồn tại. Nếu không nó sẽ được đặt ở phần cuối của bảng vì nó được viết bây giờ, có thể là một chút bối rối khi thực hiện đơn giảnSELECT * ...
StefanK

Cách giành vị trí đầu tiên cho cột 'id' mới
TipVisor 23/03

17

Cột hiện có

Nếu bạn muốn thêm ràng buộc khóa chính vào cột hiện có, tất cả cú pháp được liệt kê trước đó sẽ không thành công.

Để thêm ràng buộc khóa chính vào cột hiện có, hãy sử dụng biểu mẫu:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql không nhận sửa đổi như tuyên bố thích hợp (ít nhất là trong XAMPP, InnoDB)
LMD

@LMD Bạn đang sử dụng phiên bản mysql nào? (Chú ý: Tôi biết nó đã làm việc tại thời điểm tôi đăng tải này và tôi tin rằng đó là 5,6 ... nhưng tôi không thể nhớ chắc chắn)
MER

1
Nếu đối với bạn, giống như đối với tôi, nó không hoạt động, hãy thay thế MODIFY bằng CHANGE và nó sẽ hoạt động!
csr-nontol

12

Nếu bảng của bạn khá lớn, tốt hơn là không sử dụng câu lệnh:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

bởi vì nó tạo một bản sao của tất cả dữ liệu trong một bảng tạm thời, thay đổi bảng và sau đó sao chép lại. Tốt hơn nên làm điều đó theo cách thủ công. Đổi tên bảng của bạn:

rename table goods to goods_old;

tạo bảng mới với khóa chính và tất cả các chỉ mục cần thiết:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

di chuyển tất cả dữ liệu từ bảng cũ sang bảng mới, tắt các khóa và chỉ mục để tăng tốc độ sao chép:

- SỬ DỤNG ĐIỀU NÀY CHO BẢNG BIỂU CỦA MyISAM :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

HOẶC LÀ

- SỬ DỤNG CÁI NÀY CHO BẢNG InnoDB :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

Mất 2 000 giây để thêm PK vào một bảng có ~ 200 triệu hàng.


Tôi rất ngạc nhiên về việc tôi cần tìm kiếm bao lâu để tìm ra câu trả lời này. Cảm ơn vì những ví dụ hữu ích.
Ryan

4

Không chắc liệu điều này có vấn đề với bất kỳ ai khác hay không, nhưng tôi thích bảng id hơn cột đầu tiên trong cơ sở dữ liệu. Cú pháp cho điều đó là:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Đó chỉ là một cải tiến nhỏ so với câu trả lời đầu tiên. Nếu bạn muốn nó ở một vị trí khác, thì

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft


3

Sử dụng truy vấn này,

alter table `table_name` add primary key(`column_name`);

2

Mã này hoạt động trong db mysql của tôi:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);


0

Thử cái này,

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

Đối với tôi, không có đề xuất nào có hiệu quả khi gây ra lỗi cú pháp, vì vậy tôi chỉ thử sử dụng phpmyadmin (phiên bản 4.9.2), (10.4.10-MariaDB) và thêm idcột với khóa chính tự động tăng. Idcột đã được thêm độc đáo từ phần tử đầu tiên.

Kết quả truy vấn là:

BẢNG ALTER table_nameTHÊM VÀO idKHÔNG ĐẦY ĐỦ AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);


-3

Xóa dấu ngoặc kép để hoạt động bình thường ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
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.