2

古いシステムから新しいシステムを開発しています。新しいシステムは MySQL と Java を使用しています。テーブルの数を減らして始めたいと思います。テーブルを削除すると、たとえば X の場合、X へのすべての参照も削除されるようにするにはどうすればよいでしょうか。テーブル Y にテーブル X への FK がある場合、テーブル Y では FK と FK で使用されている列も削除されます。 ?

簡単な例:

CREATE TABLE `Y` (
    `yID` int(11) NOT NULL AUTO_INCREMENT,
    `yName` varchar(50) NOT NULL,
    ...
   ) ENGINE=InnoDB;

CREATE TABLE `user` (
    `userID` int(11) NOT NULL AUTO_INCREMENT,
    `userName` varchar(50) NOT NULL,
    `givenName` varchar(50) DEFAULT NULL,
    `sourceYID` int(11) NOT NULL,
    CONSTRAINT `USER_FK_sourceYID` FOREIGN KEY (`sourceYID`) REFERENCES `Y` (`yID`)
    ) ENGINE=InnoDB;

できれば1つのコマンドを発行したいと思います

DROP TABLE `Y`

そしてユーザーテーブルで

  • 制約を削除しますUSER_FK_sourceYID
  • 列を削除しますsourceYID
  • KEY/INDEX 定義が含まれている場合は、それに基づいてすべて削除しますsourceYID(この例には含まれていません)。
4

3 に答える 3

2

これを実行できる単一のコマンドはありません。これを処理する最も簡単な方法は、制約を削除してから親テーブルを削除することです。制約なしで、これを自由に行うことができます。

ALTER TABLE `user` DROP FOREIGN KEY `USER_FK_sourceYID`;
DROP TABLE `Y`;

列を削除すると、その列が属するすべてのインデックスから自動的に削除されます。複合インデックスであっても、残りの列を含むインデックスが残ります。いくつかの架空のインデックスの例を次に示します。列を削除するとどうなるかを確認します。

CREATE INDEX y1 ON `user` (sourceYID);
CREATE INDEX y2 ON `user` (userID, sourceYID);
CREATE INDEX y3 ON `user` (sourceYID, userID);

ALTER TABLE `user` DROP COLUMN `sourceYID`;

その結果、インデックスy1がなくなり、両方がuserID列のみを含む単一列のインデックスになりますy2y3

SHOW CREATE TABLE `user`\G

CREATE TABLE `user` (
  `userID` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(50) NOT NULL,
  `givenName` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`userID`),
  KEY `y2` (`userID`),
  KEY `y3` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

したがって、これら2つは同一のインデックスになり、pt-duplicate-key-checkerを実行して、そのような場合のスキーマを分析する必要があります。

于 2012-11-19T19:52:43.113 に答える
0

外部キーがある場合、親テーブルを削除することはできません。外部キーの関係ではそれが許可されません。これを行うには、次の手順を実行する必要があります。

  • すべての子レコードを削除するには、ON DELETE CASCADE 外部キー オプションを使用するか、複数テーブルの DELETE ステートメントを使用する 2 つの方法があります。
  • 外部キーが存在する場合は削除します。
  • 親テーブルを削除します。
于 2012-11-19T07:20:44.087 に答える