Xóa khóa chính trong MySQL


182

Tôi có lược đồ bảng sau đây ánh xạ user_customers tới các quyền trên cơ sở dữ liệu MySQL trực tiếp:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Tôi muốn xóa các khóa chính cho user_customer_id và allow_id và giữ lại khóa chính cho id.

Khi tôi chạy lệnh:

alter table user_customer_permission drop primary key;

Tôi nhận được lỗi sau đây:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Làm cách nào tôi có thể thả khóa chính của cột?

Câu trả lời:


286

Không có chỉ mục, việc duy trì cột tự động trở nên quá tốn kém, đó là lý do tại sao MySQLyêu cầu cột tự động phải là phần ngoài cùng của chỉ mục.

Bạn nên xóa thuộc tính tự động trước khi thả khóa:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Lưu ý rằng bạn có một hỗn hợp PRIMARY KEYbao gồm cả ba cột và idkhông được đảm bảo là duy nhất.

Nếu nó xảy ra là duy nhất, bạn có thể làm cho nó trở thành một PRIMARY KEYAUTO_INCREMENTmột lần nữa:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

Sau đó tôi có phải khôi phục cột id làm khóa chính auto_increment không? thay đổi bảng user_customer_ allow thêm khóa chính (id); thay đổi bảng user_customer_ allow thay đổi id id int (11) auto_increment;
markb

@markb: nếu bạn khôi phục khóa chính, bạn chắc chắn có thể hoàn nguyên lại AUTO_INCREMENT.
Quassnoi

điều này có nghĩa là cột tự động là một phần ngoài cùng bên trái của KHÓA CHÍNH. ?
Arup Rakshit

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/NH Để sử dụng AUTO_INCREMENTcơ chế với bảng InnoDB, một AUTO_INCREMENTcột ai_colphải được xác định là một phần của chỉ mục để có thể thực hiện tương đương với SELECT MAX(ai_col)tra cứu được lập chỉ mục trên bảng để có được giá trị cột tối đa. Thông thường, điều này đạt được bằng cách đặt cột thành cột đầu tiên của một số chỉ mục bảng.
Quassnoi

Nó nói PRIMARY không được xác định. Tại sao điều này xảy ra? Vì vậy, tôi đã phải xóa và thêm lại cột ID mà không chỉ định khóa chính
mrbengi

121

Một đường thẳng:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Bạn cũng sẽ không mất tự động tăng và phải thêm lại nó có thể có tác dụng phụ.


5
Tôi nghĩ rằng câu trả lời này cần phải nổi lên hàng đầu vì nó không chỉ loại bỏ sự cần thiết phải thay đổi định nghĩa trường, nó còn cho phép thay đổi thông qua các ràng buộc fk trên bảng bị thay đổi - thực sự đã giúp tôi thoát khỏi!
tomfumb

Hoàn hảo ! Đối với tôi, việc bỏ khóa chính không hoạt động, ngay cả khi tôi thay đổi trường để thoát khỏi mức tăng tự động. Nhưng giải pháp này hoạt động tốt!
dùng2447161

14

Tôi tin rằng Quassnoi đã trả lời câu hỏi trực tiếp của bạn. Chỉ là một lưu ý phụ: Có thể đây chỉ là một số từ ngữ khó xử về phía bạn, nhưng dường như bạn có ấn tượng rằng bạn có ba khóa chính, một khóa trên mỗi trường. Đây không phải là trường hợp. Theo định nghĩa, bạn chỉ có thể có một khóa chính. Những gì bạn có ở đây là một khóa chính là tổng hợp của ba trường. Do đó, bạn không thể "thả khóa chính trên một cột". Bạn có thể thả khóa chính hoặc không thả khóa chính. Nếu bạn muốn khóa chính chỉ bao gồm một cột, bạn có thể thả khóa chính hiện có trên 3 cột và tạo khóa chính mới trên 1 cột.


11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

7

Trong trường hợp bạn có khóa chính tổng hợp, hãy làm như thế này- ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);


5

"nếu bạn khôi phục khóa chính, bạn chắc chắn có thể hoàn nguyên lại thành AUTO_INCREMENT"

Không nên đặt câu hỏi về việc có nên "khôi phục thuộc tính PK" và "khôi phục thuộc tính tự động" của cột ID hay không.

Cho rằng nó là một phần tự động trong định nghĩa trước của bảng, có khả năng tồn tại một số chương trình chèn vào bảng này mà không cung cấp giá trị ID (vì dù sao thì cột ID là tự động tăng).

Bất kỳ hoạt động nào của chương trình như vậy sẽ bị phá vỡ bằng cách không khôi phục thuộc tính tự động.


3

Trước tiên, sửa đổi cột để xóa trường auto_increment như thế này: thay đổi bảng user_customer_ allow sửa đổi cột id int;

Tiếp theo, thả khóa chính. thay đổi bảng user_customer_ allow thả khóa chính;



1

Tôi đã có cùng một vấn đề và bên cạnh một số giá trị trong bảng của tôi. Mặc dù tôi đã thay đổi Khóa chính của mình bằng

ALTER TABLEuser_customer_ allow DROP PRIMARY KEY , ADD PRIMARY KEY (id)

vấn đề tiếp tục trên máy chủ của tôi. Tôi đã tạo trường mới bên trong bảng Tôi đã chuyển các giá trị sang trường mới và xóa trường cũ, vấn đề đã được giải quyết !!


1

Để thêm khóa chính trong cột.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Để loại bỏ khóa chính khỏi bảng.

ALTER TABLE table_name DROP PRIMARY KEY;

0

Đầu tiên sao lưu cơ sở dữ liệu. Sau đó thả bất kỳ khóa ngoại liên quan đến bảng. cắt ngắn bảng khóa ngoại. Cắt bớt bảng hiện tại. Hủy bỏ các khóa chính cần thiết. Sử dụng sqlyog hoặc workbench hoặc heidisql hoặc dbeaver hoặc phpmyadmin.


0

Tìm bảng trong trình quản lý SQL nhấp chuột phải vào nó và chọn thiết kế, sau đó nhấp chuột phải vào biểu tượng phím nhỏ và chọn xóa khóa chính.


Mặc dù bài đăng này có thể giải quyết câu hỏi, bao gồm ảnh chụp màn hình thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn sẽ trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết cùng giao diện người dùng mà bạn đang xem.
Cướp biển X
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.