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;

我想最好发出一个命令

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消失了,并且两者都y2y3简化为仅包含 userID 列的单列索引:

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

因此,这两个现在是相同的索引,您应该运行pt-duplicate-key-checker来分析您的架构以应对这种情况。

于 2012-11-19T19:52:43.113 回答
1
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists <your_1st_table>;
drop table if exists <your_2nd_table>;
SET FOREIGN_KEY_CHECKS = 1;
于 2018-08-10T09:55:43.737 回答
0

如果您有外键,那么您将无法删除父表,外键关系将不允许这样做。为此,您应该执行以下步骤:

  • 删除所有子记录,有两种方法:使用ON DELETE CASCADE 外键选项,或使用多表DELETE 语句。
  • 如果存在,则删除外键。
  • 删除父表。
于 2012-11-19T07:20:44.087 回答