2013-01-02 33 views
181

Tôi muốn xóa các ràng buộc khỏi bảng của mình. truy vấn của tôi là:Làm thế nào để loại bỏ các ràng buộc khỏi bảng MySQL của tôi?

ALTER TABLE `tbl_magazine_issue` 
DROP CONSTRAINT `FK_tbl_magazine_issue_mst_users` 

Nhưng tôi đã nhận ra lỗi:

#1064 - 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 'constraint FK_tbl_magazine_issue_mst_users ' at line 1

+0

Cần lưu ý rằng nếu bạn tạo ra ràng buộc 'CHECK', 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à bạn thậm chí có thể chạy 'thêm ràng buộc' hơn và hơn nữa mà không có bất kỳ lỗi nào. MySQL không hỗ trợ các ràng buộc 'CHECK' 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

+0

yêu cầu tính năng: [Khóa ngoại: TỪ XẾP LỆNH làm bí danh tương thích cho DROP NGOẠI HỐI] (https://bugs.mysql.com/bug.php?id=3742) –

Trả lời

326

Mysql có một cú pháp đặc biệt cho thả ràng buộc khoá ngoại:

ALTER TABLE tbl_magazine_issue 
    DROP FOREIGN KEY FK_tbl_magazine_issue_mst_users 
+9

Postgres, MSSQL và Oracle tất cả đều có 'thay đổi bảng .. thả ràng buộc'. MySQL là một trong những lẻ, có vẻ như. –

+0

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

+0

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

24

Không có những điều như DROP CONSTRAINT trong MySQL. Trong trường hợp của bạn, bạn có thể sử dụng DROP FOREIGN KEY để thay thế.

34

tôi đã cùng một vấn đề và tôi đã nhận để 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`; 
+0

Điều này có thể được xem là chính xác hơn so với giải pháp được chấp nhận, bởi vì chỉ cần loại bỏ khóa ngoài sẽ không loại bỏ chỉ mục. Tất nhiên chỉ mục có thể đã được tạo ra riêng biệt, nhưng nếu nó được tạo ra 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ị loại bỏ đơn giản bằng cách thả khóa ngoài. –

9

Nếu ràng buộc không phải là một chính nước ngoài, ví dụ. một bổ sung sử dụng 'CONSTRAINT UNIQUE (cola, colB)' sau đó nó là một chỉ số có thể được giảm bằng ALTER TABLE ... DROP INDEX ...

-5

điều này sẽ hoạt động trên MySQL để thả trở ngại

alter table tablename drop primary key; 

alter table tablename drop foreign key; 
+0

'DROP PRIMARY KEY' không hoạt động. 'DROP FOREIGN KEY' hoạt động nhưng bạn cần xác định ai là' drop'. Ví dụ: 'ALTER TABLE tablename DROP FOREIGN KEY id_name_fk' – RousseauAlexandre

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

Thật tuyệt vời, đã làm việc cho tôi khi bạn không biết id –

1

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

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

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

Sau đó, loại bỏ phím nước ngoài bằng cách chạy các DROP truy vấn KEY NƯỚC NGOÀI trước khi đề cập và đó là tên riêng.

2

Để 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ì khối mã nhận xét của SO không hiển thị tốt như các khối mã của câu trả lời), tôi sẽ thêm điều này cho các ràng buộc độc đáo. Một trong những công việc để thả các hạn chế:

ALTER TABLE `table_name` DROP KEY `uc_name`; 

hoặc

ALTER TABLE `table_name` DROP INDEX `uc_name`; 
0

Ngoài ra tốt đẹp, bạn có thể tạm thời vô hiệu hóa tất cả các kiểm tra chính nước ngoài từ một cơ sở dữ liệu mysql: SET FOREIGN_KEY_CHECKS=0; Và để cho phép nó một lần nữa: SET FOREIGN_KEY_CHECKS=1;

Các vấn đề liên quan