Đâ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?
Đâ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?
Câu trả lời:
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 KEY
chứ không chỉ từ PRIMARY
:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
FIRST
sau AUTO_INCREMENT
, có nghĩa là id
cộ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 * ...
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;
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;
- 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.
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
Sử dụng truy vấn này,
alter table `table_name` add primary key(`column_name`);
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`);
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Thử cái này,
alter table goods add column `id` int(10) unsigned primary key auto_increment
Đố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 id
cột với khóa chính tự động tăng. Id
cột đã được thêm độc đáo từ phần tử đầu tiên.
Kết quả truy vấn là:
BẢNG ALTER table_name
THÊM VÀO id
KHÔNG ĐẦY ĐỦ AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id
);
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;