На данный момент наши DDL CREATE TABLE имеют этот формат - обратите внимание на синтаксис определения UNIQUE KEY и FOREIGN KEY, который мы использовали.
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)
);
В этом формате MySQL автоматически создает INDEX-ы с именами uk1_my_table и fk1_my_table; но имя объекта FK - это нечто иное - my_table_ibfk_1 (т. е. tablename_ibfk_N - определено системой). Так что ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
не будет работать (и, следовательно, разочаровывать и поднимать тревоги), так как нет объекта FK db с таким именем.
Вот альтернативный формат DDL с ограничениями (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)
);
В этом формате MySQL все еще автоматически создает INDEX-ы с именами uk1_my_table и fk1_my_table, но имя объекта FK не является чем-то другим - это fk1_my_table, как упомянуто в DDL. Так что ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
работает, но оставляет одноименный INDEX.
И обратите внимание, что ALTER TABLE my_table DROP INDEX fk1_my_table
изначально не будет работать (когда FK еще не удален), с сообщением об ошибке, что он используется в FK! Если команда DROP FK была выполнена успешно, только тогда работает DROP INDEX.
Надеюсь, что это объясняет и помогает разрешить путаницу.