現在、CREATE TABLE DDL はこの形式になっています。使用した 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 は uk1_my_table および fk1_my_table という名前の INDEX-es を自動的に作成します。ただし、FK オブジェクト名は my_table_ibfk_1 (つまり、tablename_ibfk_N – システム定義) とは異なります。その名前の FK db オブジェクトがないため、機能しません (したがってALTER TABLE my_table DROP FOREIGN KEY fk1_my_table
、イライラしてアラームが発生します)。
これは、constarints に関する代替 DDL 形式です (参照: 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 は引き続き uk1_my_table および fk1_my_table という名前の INDEX-es を自動的に作成しますが、FK オブジェクト名は別のものではなく、DDL で言及されているように fk1_my_table です。そのよう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 が機能します。
これが混乱を説明し、解決するのに役立つことを願っています。