2

制約を削除して追加するよりも、既存の外部キーに CASCADE ルールを追加するより速い方法はありますか?

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

マニュアルによると、単一の ALTER TABLE ステートメントの別々の句で外部キーを追加したり、外部キーを削除したりすることはできません。別のステートメントを使用する必要があります。

4

1 に答える 1

2

「MySQLWorkbench5.2CE-> EER Diagram」を使用して、外部キーオプションのみを変更しようとしました:テーブルの「ondeleterestrict」から「ondeletecascade」に変更します。

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;

これは、外部キーオプションを2段階で変更するのが自然な方法だと思います。

于 2013-02-11T09:27:24.273 に答える