MySQL loại bỏ một số khóa ngoại


189

Tôi có một bảng có khóa chính được sử dụng trong một số bảng khác và có một số khóa ngoại cho các bảng khác.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Vấn đề là khi tôi cố gắng thả một trong các cột khóa ngoại (tức là locationIDX), nó sẽ gây ra lỗi cho tôi.

"LRI 1025 (HY000): Lỗi khi đổi tên"

Làm cách nào tôi có thể thả cột trong bảng gán ở trên mà không gặp lỗi này?

Câu trả lời:


446

Như đã giải thích ở đây , dường như ràng buộc khóa ngoại phải được loại bỏ bằng tên ràng buộc chứ không phải tên chỉ mục. Cú pháp là:

alter table footable drop foreign key fooconstraint

35
Đây là vấn đề của tôi. Tôi cảm thấy ngớ ngẩn bây giờ. Nếu bất cứ ai khác có vấn đề này, bạn có thể tìm thấy các tên ràng buộc khóa ngoài bằng cách sử dụng chức năng SHOW CREATE TABLE.
vẽ

14
Mẹo: sử dụng SHOW CREATE TABLE footable;để xem tên của ràng buộc là gì. Nó không phải là tên của cột per-se. Cảm ơn câu trả lời!
Chris Baker

2
Bạn có thể sử dụng để tìm ràng buộc khoá ngoại: SELECT * FROM information_schema.table_constraints ĐÂU constraint_schema = '<tên db của bạn>' VÀ constraint_type = 'FOREIGN KEY'
Gayan Dasanayake

21

Các khóa ngoại ở đó để đảm bảo tính toàn vẹn dữ liệu, vì vậy bạn không thể bỏ một cột miễn là nó là một phần của khóa ngoại. Bạn cần bỏ chìa khóa trước.

Tôi nghĩ rằng truy vấn sau đây sẽ làm điều đó:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Như mọi người đã nói ở trên, bạn có thể dễ dàng xóa FK. Tuy nhiên, tôi chỉ nhận thấy rằng có thể cần phải bỏ phím KEY vào một lúc nào đó. Nếu bạn có bất kỳ thông báo lỗi nào để tạo một chỉ mục khác như chỉ mục cuối cùng, ý tôi là với cùng một tên, sẽ rất hữu ích khi bỏ mọi thứ liên quan đến chỉ mục đó.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

Kiểm tra tên CONSTRAINT và tên NGOẠI TỆ:

SHOW CREATE TABLE table_name;

Xóa cả tên CONSTRAINT và tên NGOẠI TỆ:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Hi vọng điêu nay co ich!


4

Đây là một cách để giảm ràng buộc khóa ngoại, nó sẽ hoạt động. BẢNG BẢNG location. location_id DROP NGOẠI PHÍ location_ibfk_1;


2

Này, tôi đã làm theo một số trình tự ở trên, và tìm thấy một số giải pháp.

SHOW CREATE TABLE footable;

Bạn sẽ nhận được Tên ràng buộc FK như

ProjectsInfo_ibfk_1

Bây giờ bạn cần loại bỏ các ràng buộc này. bằng cách thay đổi bảng commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Sau đó thả cột bảng,

alter table ProjectsInfo drop column clientId;

1

Bạn thường gặp lỗi này nếu các bảng của bạn sử dụng công cụ InnoDB. Trong trường hợp đó, bạn sẽ phải bỏ khóa ngoại, rồi thực hiện bảng thay đổi và thả cột.

Nhưng phần khó khăn là bạn không thể bỏ khóa ngoại bằng tên cột, mà thay vào đó, bạn sẽ phải tìm tên được sử dụng để lập chỉ mục. Để tìm thấy điều đó, đưa ra lựa chọn sau:

HIỂN THỊ TẠO BẢNG vùng; Điều này sẽ hiển thị cho bạn một hàng, ở góc trên bên trái nhấp vào tùy chọn +, nhấp vào nút raio toàn văn bản sau đó nhấp vào đi. Ngoài ra, bạn sẽ nhận được tên của chỉ mục, đại loại như thế này:

CONSTRAINT area_ibfk_1 FOREIGN KEY (country_id) TÀI LIỆU THAM KHẢO quốc gia (id) TRÊN XÓA KHÔNG CÓ HÀNH ĐỘNG TRÊN CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG Bây giờ chỉ cần đưa ra:

thay đổi vùng bảng thả khóa ngoại vùng area_ibfk_1;

hoặc là

đơn giản hơn chỉ cần gõ: - bảng thay đổi TableName thả khóa ngoại TableName_ibfk_1 ;

hãy nhớ điều duy nhất là thêm _ibfk_1 sau tablename của bạn để thực hiện như sau: - Tên bảng _ibfk_1


0

Bạn không thể thả cột khóa ngoại vì nó đang được tham chiếu từ bảng assignmentStuff. Vì vậy, trước tiên bạn nên bỏ các ràng buộc khóa ngoại assignmentStuff.assignmentIDX.

Một câu hỏi tương tự đã được hỏi ở đây . Kiểm tra cũng ở đây để biết thêm.


1
Vì vậy, vì khóa chính của tham chiếu gánStuff, tôi không thể bỏ cột locationID của gán? Đây có vẻ là loại truy cập trực quan.
vẽ

Có vẻ như tôi đã chuyển một số tên cột để câu trả lời của tôi không thực sự có ý nghĩa. Xin lỗi vì điều đó ...
Ronald Wildenberg


0

bước 1: show create table vendor_locations;

bước 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

nó làm việc cho tôi


0

trước tiên cần lấy tên ràng buộc thực tế bằng truy vấn này

SHOW CREATE TABLE TABLE_NAME

Truy vấn này sẽ dẫn đến tên ràng buộc của khóa ngoại, bây giờ bên dưới truy vấn sẽ bỏ nó.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

số cuối cùng trong tên ràng buộc ở trên phụ thuộc vào số lượng khóa ngoại bạn có trong bảng

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.