11

以下の構造のテーブルがあります。

    CREATE TABLE `Lm_help` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `section` int(10) NOT NULL,
 `language` int(10) NOT NULL,
 `title` varchar(255) NOT NULL,
 `text` text NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`),
 UNIQUE KEY `unique_help` (`section`,`language`),
 KEY `language_constraint` (`language`),
 CONSTRAINT `language_constraint` FOREIGN KEY (`language`) REFERENCES `Lm_languages` (`id`),
 CONSTRAINT `section_constraint` FOREIGN KEY (`section`) REFERENCES `Lm_help_sections` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1

「unique_help」キーを削除する必要がありますが、外部キー制約エラーが発生しています。

このエラーのため、section_constraint、language_constraint、unique_help のうち何も削除できませんでした。

以下は、これを参照する他の表です。

CREATE TABLE `Lm_languages` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `code` varchar(255) NOT NULL,
 `status` int(11) DEFAULT NULL,
 `created_at` datetime NOT NULL,
 `updated_at` datetime NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1




CREATE TABLE `Lm_help_sections` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1
4

4 に答える 4

19

問題は、unique_help (section, language)インデックスがsection_constraint外部キー制約によって使用されていることです。したがって、最初に制約を削除せずにインデックスを削除することはできません。


これを解決する 1 つの方法は、最初に外部キー制約を削除してから、インデックスを削除することです。

次に、(単純な)インデックスを追加(section)して、外部キーを再作成できます。

これらはすべて 1 つのステートメントで実行できます。

ALTER TABLE Lm_help
    DROP FOREIGN KEY section_constraint,   -- drop the FK so
    DROP INDEX unique_help,                -- the index can be dropped
                                           -- and then
    ADD INDEX section_IX (section),        -- add a new index
    ADD CONSTRAINT section_FK              -- so the FK can be recreated
        FOREIGN KEY (section) 
        REFERENCES Lm_help_sections (id)
  ;

SQL-Fiddleでテスト済み


改善

私は間違っていました。制約を削除して再作成する必要はありません。新しいインデックスが作成されている限り、インデックスを削除できます。

ALTER TABLE Lm_help
    DROP INDEX unique_help,
    ADD INDEX section_IX (section) 
  ; 

SQL-Fiddle-2でテスト済み

于 2013-05-14T11:52:30.477 に答える
8
ALTER TABLE Orders
DROP FOREIGN KEY 'language_constraint';

ALTER TABLE Orders
DROP FOREIGN KEY 'section_constraint';

ここで削除クエリを実行

ALTER TABLE Orders
ADD CONSTRAINT `language_constraint`
FOREIGN KEY (`language`)
REFERENCES `Lm_languages` (`id`);

ALTER TABLE Orders
ADD CONSTRAINT `section_constraint`
FOREIGN KEY (`section`)
REFERENCES `Lm_help_sections` (`id`);
于 2013-05-14T11:51:02.103 に答える
2

エラーメッセージが示唆するように

(...) [外部キーによって参照されるテーブル]には、参照される列が最初の列として同じ順序でリストされているインデックスが必要です。

参照テーブルを見つけて、この (これらの) 他のテーブルから外部キー制約を削除する必要があります。

残念ながら、テーブル定義を読むのが早すぎました。実際の問題はです。

MySQL では、外部キーのチェックが高速になり、テーブル スキャンが不要になるように、外部キーと参照キーにインデックスが必要です。

section_constraint最初に外部キー制約を削除するかlanguage、UNIQUE 制約を削除する前に新しいインデックスを作成してください。

于 2013-05-14T11:46:03.187 に答える