Hiện tại, DDL TẠO TẠO của chúng tôi có định dạng này - hãy chú ý đến cú pháp định nghĩa KEY UNIQUE và NGOẠI TỆ mà chúng tôi đã sử dụng.
CREATE TABLE my_dbschema.my_table (
id INT unsigned auto_increment PRIMARY KEY,
account_nbr INT NOT NULL,
account_name VARCHAR(50) NOT NULL,
active_flg CHAR(1) NOT NULL DEFAULT 'Y',
vendor_nbr INT NOT NULL,
create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
UNIQUE KEY uk1_my_table(account_nbr, account_name),
FOREIGN KEY fk1_my_table(vendor_nbr) REFERENCES vendor(vendor_nbr)
);
Ở định dạng này, MySQL đang tạo INDEX-es với tên uk1_my_table và fk1_my_table tự động; nhưng tên đối tượng FK là một cái gì đó khác nhau - my_table_ibfk_1 (tức là tablename_ibfk_N - hệ thống được định nghĩa). Vì vậy, ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
sẽ không hoạt động (và do đó làm phiền và tăng báo động), vì không có đối tượng db FK nào theo tên đó.
Dưới đây là một wrt định dạng thay thế DDL các constarints (Ref: https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html): -
CREATE TABLE my_dbschema.my_table (
id INT unsigned auto_increment PRIMARY KEY,
account_nbr INT NOT NULL,
account_name VARCHAR(50) NOT NULL,
active_flg CHAR(1) NOT NULL DEFAULT 'Y',
vendor_nbr INT NOT NULL,
create_ts TIMESTAMP NOT NULL DEFAULT current_timestamp,
create_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
last_upd_ts TIMESTAMP NOT NULL DEFAULT current_timestamp ON UPDATE current_timestamp,
last_upd_usr_id VARCHAR(10) NOT NULL DEFAULT 'DFLTUSR',
CONSTRAINT uk1_my_table UNIQUE KEY (account_nbr, account_name),
CONSTRAINT fk1_my_table FOREIGN KEY (vendor_nbr) REFERENCES vendor(vendor_nbr)
);
Trong định dạng này, MySQL vẫn tạo INDEX-es với tên uk1_my_table và fk1_my_table tự động, nhưng tên đối tượng FK không phải là một cái gì đó khác nhau - đó là fk1_my_table như đã đề cập trong DDL. Vì vậy, ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
hoạt động, nhưng để lại đằng sau tên INDEX.
Và lưu ý rằng ALTER TABLE my_table DROP INDEX fk1_my_table
sẽ không hoạt động lúc đầu (khi FK chưa được loại bỏ), với thông báo lỗi đang được sử dụng trong FK! Nếu lệnh DROP FK đã được thực hiện thành công thì chỉ DROP INDEX hoạt động.
Hy vọng điều này sẽ giải thích và giúp giải quyết sự nhầm lẫn.
Câu trả lời hay! – HPM