Làm thế nào để loại bỏ các ràng buộc từ bảng MySQL của tôi?


252

Tôi muốn loại bỏ các ràng buộc từ bảng của tôi. Truy vấn của tôi là:

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users`

Nhưng tôi đã gặp một lỗi:

#1064- Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'ràng buộc FK_tbl_magazine_issue_mst_users' ở dòng 1


1
Điều đáng chú ý là nếu bạn tạo một CHECKràng buộc, không cần phải bỏ nó vì không có ràng buộc thực tế nào được tạo ra. Bạn có thể chọn từ information_schema.table_constraintsđể xác minh và thậm chí bạn có thể chạy đi chạy add constraintlại mà không gặp bất kỳ lỗi nào. MySQL không hỗ trợ các CHECKràng buộc nhưng cho phép SQL dự định tạo ra chúng (mà không thực sự tạo ra các ràng buộc).
ADTC


Bản sao có thể có của Xóa khóa chính trong MySQL
劉鎮 19/12/18

Cú pháp của bạn là hoàn toàn hợp lệ và bây giờ nó được hỗ trợ demo
Lukasz Szozda

Câu trả lời:


423

Mysql có một cú pháp đặc biệt để loại bỏ các ràng buộc khóa ngoài:

ALTER TABLE tbl_magazine_issue
  DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users

21
Postgres, MSSQL và Oracle đều có alter table .. drop constraint. MySQL là một trong những lẻ, có vẻ như.
Jared Beck

Nó nói rằng nó không thể thả các beacuses "cột2" cần thiết trong một ràng buộc khóa ngoại. Khi tôi làm như bạn nói tôi nhận được "Cant DROP cột2; kiểm tra xem cột / khóa có tồn tại không"
Lealo

Được rồi, tôi hiểu rồi, nước ngoài là một thứ riêng biệt chỉ kết nối cột với các cột bảng khác. Của tôi đã có một tên tiêu chuẩn được đặt cho nó. Ngoài ra bây giờ tôi bây giờ bạn có thể thả các khóa ngoại một cách an toàn mà không bị rơi cột
Lealo

1
Giải pháp của Wellington Lorindo có thể được coi là chính xác hơn, bởi vì chỉ cần xóa khóa ngoại sẽ không xóa chỉ số liên quan. Tất nhiên chỉ mục có thể đã được tạo riêng, nhưng nếu nó được tạo như là kết quả của việc thêm khóa ngoại ở vị trí đầu tiên, thì nó sẽ không bị xóa chỉ bằng cách bỏ khóa ngoại.
Rich Harding

55

Tôi đã có cùng một vấn đề và tôi phải giải quyết với mã này:

ALTER TABLE `table_name` DROP FOREIGN KEY `id_name_fk`;
ALTER TABLE `table_name` DROP INDEX  `id_name_fk`;

2
Điều này có thể được coi là chính xác hơn giải pháp được chấp nhận, bởi vì chỉ cần xóa khóa ngoại sẽ không xóa chỉ mục. Tất nhiên chỉ mục có thể được tạo riêng, nhưng nếu nó được tạo như là kết quả của việc thêm khóa ngoại ở vị trí đầu tiên thì nó sẽ không bị xóa chỉ bằng cách bỏ khóa ngoại.
Rich Harding

3
Như một lệnh duy nhất: ALTER TABLE table_name DROP FOREIGN KEY IF EXISTS id_name_fk, DROP INDEX IF EXISTS id_name_fk;
Frank Forte

26

Không có những thứ như DROP CONSTRAINTtrong MySQL. Trong trường hợp của bạn, bạn có thể sử dụng DROP FOREIGN KEYthay thế.


12

Nếu ràng buộc không phải là khóa ngoại, vd. một được thêm vào bằng cách sử dụng 'UNIQUE CONSTRAINT (colA, colB)' thì đó là một chỉ mục có thể được loại bỏ bằng cách sử dụngALTER TABLE ... DROP INDEX ...


9

Cũng tốt, bạn có thể tạm thời vô hiệu hóa tất cả các kiểm tra khóa ngoại từ cơ sở dữ liệu mysql: SET FOREIGN_KEY_CHECKS=0; Và để bật lại: SET FOREIGN_KEY_CHECKS=1;


8

Để thêm một chút vào câu trả lời của Robert Knight, vì tiêu đề của bài đăng không đề cập đến khóa ngoại (và vì anh ta không có mẫu mã hoàn chỉnh và vì các khối mã nhận xét của SO không hiển thị cũng như mã câu trả lời các khối), tôi sẽ thêm phần này cho các ràng buộc duy nhất . Một trong những công việc này để loại bỏ các ràng buộc:

ALTER TABLE `table_name` DROP KEY `uc_name`;

hoặc là

ALTER TABLE `table_name` DROP INDEX `uc_name`;

4

Một số ORM hoặc khung sử dụng quy ước đặt tên khác cho khóa ngoại so với mặc định FK_[parent table]_[referenced table]_[referencing field], vì chúng có thể bị thay đổi.

Ví dụ, Laravel sử dụng [parent table]_[referencing field]_foreignnhư quy ước đặt tên. Bạn có thể hiển thị tên của các khóa ngoại bằng cách sử dụng truy vấn này, như được hiển thị ở đây :

SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE REFERENCED_TABLE_SCHEMA = '<database>' AND REFERENCED_TABLE_NAME = '<table>';

Sau đó xóa khóa ngoại bằng cách chạy truy vấn DROP FOREIGN KEY đã đề cập trước đó và tên riêng của nó.


2

Đối với những người đến đây bằng MariaDB:

Lưu ý rằng MariaDB cho phép các câu lệnh DROP CONSTRAINT nói chung, ví dụ để loại bỏ các ràng buộc kiểm tra:

ALTER TABLE table_name
DROP CONSTRAINT constraint_name;

https://mariadb.com/kb/en/lvern/alter-table/


Vâng, điều này là cho các ràng buộc trong cùng một bảng, ví dụ CONSTRAINT CHECK(a > b). Đối với các ràng buộc khóa ngoại, có vẻ như bạn vẫn cần DROP FOREIGN KEYcú pháp, ít nhất là trong phiên bản MariaDB 10.2
Frank Forte

1
  1. Đi đến cấu trúc của bảng
  2. Bạn sẽ thấy 2 tùy chọn ở đầu a.Table cấu trúc b. Quan điểm quan hệ .
  3. Bây giờ bấm vào quan điểm quan hệ , ở đây bạn có thể thả ràng buộc khóa ngoại của bạn. Bạn sẽ nhận được tất cả các mối quan hệ ở đây.

Điều đó thật tuyệt, đã làm việc cho tôi khi bạn không biết id
Silviu St

0

Không có DROP CONSTRAINTtrong MySql. Công việc này giống như phép thuật trong mysql 5.7

ALTER TABLE answer DROP KEY const_name;

0

Cách đơn giản nhất để loại bỏ ràng buộc là sử dụng cú pháp được ALTER TABLE tbl_name DROP CONSTRAINT symbol;giới thiệu trong MySQL 8.0.19 :

Kể từ MySQL 8.0.19, ALTER TABLE cho phép cú pháp chung hơn (và tiêu chuẩn SQL) để loại bỏ và thay đổi các ràng buộc hiện có của bất kỳ loại nào, trong đó loại ràng buộc được xác định từ tên ràng buộc

ALTER TABLE tbl_magazine_issue DROP CONSTRAINT FK_tbl_magazine_issue_mst_users;

db <> fiddle demo


-4

điều này sẽ hoạt động trên MySQL để loại bỏ các ràng buộc

alter table tablename drop primary key;

alter table tablename drop foreign key;

DROP PRIMARY KEYkhông nên làm việc DROP FOREIGN KEYhoạt động nhưng bạn cần chỉ định ai drop. Ví dụALTER TABLE tablename DROP FOREIGN KEY id_name_fk
RousseauAlexandre
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.