Por el momento, nuestros DDL de CREATE TABLE tienen este formato: tenga en cuenta la sintaxis de definición KEY UNIQUE KEY y FOREIGN KEY que hemos utilizado.
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)
);
En este formato, es la creación de MySQL ÍNDICE-es con los nombres uk1_my_table y fk1_my_table automáticamente; pero el nombre del objeto FK es algo diferente - my_table_ibfk_1 (es decir, tablename_ibfk_N - system defined). Por lo tanto, ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
no funcionará (y por lo tanto, frustrará y generará alarmas), ya que no hay ningún objeto FK db con ese nombre.
He aquí un WRT formato alternativo DDL las 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)
);
En este formato, MySQL sigue creando ÍNDICE-es con los nombres uk1_my_table y automáticamente fk1_my_table, pero el nombre del objeto FK no es algo diferente - es fk1_my_table como se menciona en el DDL. Así que ALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
funciona, pero deja atrás el ÍNDICE homónimo.
Y, tenga en cuenta que ALTER TABLE my_table DROP INDEX fk1_my_table
no funcionará inicialmente (cuando el FK aún no se ha eliminado), con un mensaje de error que se está utilizando en un FK. Si el comando DROP FK se ha ejecutado con éxito, solo entonces DROP INDEX funciona.
Espero que esto explique y ayude a resolver la confusión.
¡Una gran respuesta! – HPM