1

階層データを表すことを目的とした次のテーブルがあるとします。

+--------+-------------+
| Field  | Type        |
+--------+-------------+
| id     | int(10)     |
| parent | int(10)     |
| name   | varchar(45) |
+--------+-------------+

この表は、 が を参照するという点で自己参照的parent_idですid

したがって、次のデータがある可能性があります。

+----+--------+---------------+
| id | parent | name          |
+----+--------+---------------+
|  1 |      0 | fruit         |
|  2 |      0 | vegetable     |
|  3 |      1 | apple         |
|  4 |      1 | orange        |
|  5 |      3 | red delicious |
|  6 |      3 | granny smith  |
|  7 |      3 | gala          |
+----+--------+---------------+

MySQL を使用して、データに (自己参照) 外部キー制約を課して、更新時にカスケードし、「子」がある場合にレコードが削除されないようにしようとしています。

だから私は以下を使用しました:

CREATE TABLE `test`.`fruit` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parent` INT(10) UNSIGNED,
  `name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_parent`
    FOREIGN KEY (`parent`)
    REFERENCES `fruit` (`id`)
    ON UPDATE CASCADE
    ON DELETE RESTRICT
)
ENGINE = InnoDB;

私が理解していることから、これは私の要件に適合するはずです。(そしてparent、挿入を許可するには、デフォルトで null にする必要がありますよね?)

問題は、idレコードの を変更すると、カスケードしないことです。

Cannot delete or update a parent row: a foreign key constraint fails (`test`.`fruit`, CONSTRAINT `fk_parent` FOREIGN KEY (`parent`) REFERENCES `fruit` (`id`) ON UPDATE CASCADE)

私は何が欠けていますか?

私の用語が台無しになっている場合は、お気軽に修正してください...私は制約に慣れていません。

4

1 に答える 1

2

SQL標準からの逸脱:ONUPDATECASCADEまたはONUPDATESET NULLが繰り返されて、カスケード中に以前に更新されたのと同じテーブルが更新される場合、それはRESTRICTのように機能します。これは、自己参照のONUPDATECASCADEまたはONUPDATESETNULL操作を使用できないことを意味します。これは、カスケードされた更新に起因する無限ループを防ぐためです。一方、自己参照のON DELETE SET NULLは、自己参照のONDELETECASCADEと同様に可能です。カスケード操作は、15レベルを超えてネストすることはできません。

于 2010-06-01T20:16:29.967 に答える