4
CREATE  TABLE `categories` (
  `idcategories` INT NOT NULL AUTO_INCREMENT ,
  `idparent` INT NULL ,
  `description` VARCHAR(45) NULL ,
  PRIMARY KEY (`idcategories`) );

ALTER TABLE `categories` 
  ADD CONSTRAINT `FK_idparent`
  FOREIGN KEY (`idparent` )
  REFERENCES `ilmercatinodelpulcino`.`categories` (`idcategories` )
  ON DELETE CASCADE
  ON UPDATE CASCADE
, ADD INDEX `FK_idparent` (`idparent` ASC) ;

INSERT INTO `categories` (`idcategories`, `description`)
    VALUES (1, 'cat1');
INSERT INTO `categories` (`idcategories`, `idparent`, `description`)
    VALUES (2, 1, 'cat1_child');

したがって、このテーブルは、ID と自己参照型の親 ID を持つカテゴリを表します。カテゴリ cat1 と、親 ID が cat1 のサブカテゴリ cat1_child を挿入しました。

ここで、cat1 の idcategory を 1 から 10 に変更できるようにしたいと考えています。更新 CASCADE で外部キーを設定したため、cat1_child の idparent も 10 に設定されることを期待しています。しかし、私がするとき:

UPDATE `categories` SET `idcategories`=10 WHERE `idcategories`='1';

エラーが発生します:

エラー 1451: 親行を削除または更新できません: 外部キー制約が失敗しました ( categories, CONSTRAINT FK_idparentFOREIGN KEY ( idparent) REFERENCES categories( idcategories) ON DELETE CASCADE ON UPDATE CASCADE) SQL ステートメント: UPDATE categoriesSET idcategories=10 WHERE idcategories='1'

代わりに、削除は期待どおりに機能し、cat1 を削除すると、cat1_child も削除されます。

エラーはどこにありますか? あなたより。

4

2 に答える 2

7

答えはドキュメントにあると思います(一番下までスクロールします):

SQL 標準からの逸脱:カスケード中に以前に更新した同じテーブルを更新するためにON UPDATE CASCADEまたはを再帰する場合、 のように動作します。これは、自己参照または 操作を使用できないことを意味します。これは、カスケード更新による無限ループを防ぐためです。一方、自己参照は、自己参照と同様に可能です。カスケード操作は、15 レベルを超えて入れ子にすることはできません。ON UPDATE SET NULLRESTRICTON UPDATE CASCADEON UPDATE SET NULLON DELETE SET NULLON DELETE CASCADE

デモ: http://www.sqlfiddle.com/#!2/e29db/1

于 2012-04-25T17:42:50.613 に答える