MySQL InnoDB 更改 DELETE CASCADE 上的引用操作

标签 mysql innodb foreign-key-relationship cascade referential-integrity

是否有比删除并添加约束更快的方法将 CASCADE 规则添加到现有外键?

SET foreign_key_checks = 0;
ALTER TABLE drop foreign key ...;
ALTER TABLE add foreign key ...;
SET foreign_key_checks = 1;

手册说,您不能在单个 ALTER TABLE 语句的单独子句中添加外键和删除外键。您必须使用单独的语句。

最佳答案

我尝试使用“MySQL Workbench 5.2 CE->EER 图”仅更改外键选项:从表中的“on删除限制”更改为“ondelete级联”:

CREATE  TABLE IF NOT EXISTS `mydb`.`Customers` (
  `CustomerID` INT NOT NULL AUTO_INCREMENT ,
  `FirstName` VARCHAR(45) NOT NULL ,
  `LastName` VARCHAR(45) NOT NULL ,
  `Email` VARCHAR(500) NOT NULL ,
  `Password` VARCHAR(500) NOT NULL ,
  `AddressID` INT NULL ,
  PRIMARY KEY (`CustomerID`) ,
  INDEX `AddressID_idx` (`AddressID` ASC) ,
  UNIQUE INDEX `Email_UNIQUE` (`Email` ASC) ,
  CONSTRAINT `CustomerAddressID`
    FOREIGN KEY (`AddressID` )
    REFERENCES `mydb`.`Address` (`AddressID` )
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;

因此,该 GUI 工具生成以下代码:

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

ALTER TABLE `mydb`.`Customers` DROP FOREIGN KEY `CustomerAddressID` ;

ALTER TABLE `mydb`.`Customers` 
  ADD CONSTRAINT `CustomerAddressID`
  FOREIGN KEY (`AddressID` )
  REFERENCES `mydb`.`Address` (`AddressID` )
  ON DELETE CASCADE
  ON UPDATE CASCADE;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

我认为这意味着这是通过两步更改外键选项的自然方法。

关于MySQL InnoDB 更改 DELETE CASCADE 上的引用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414273/

相关文章:

php - FIND_IN_SET 与 like 子句 mysql

mysql 使用 IF NOT NULL 作为事务的一部分

MySQL 索引 - In 与 Equals 索引问题

innodb - MySQL InnoDB : cannot calculate statistics because the . ibd 文件丢失

php - 应该将二对多数据关系视为多对多关系吗?

mysql - 创建外键时自动增量是否有影响?

mysql - 从两个 mysql 表中选择数据,其中第二个表中可能不存在数据

交换中的 MySQL InnoDB 索引

sql - 如何在 Cassandra CQL 中创建外键

mysql - 删除两个值匹配的行,mysql