階層データを表すことを目的とした次のテーブルがあるとします。
+--------+-------------+
| 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)
私は何が欠けていますか?
私の用語が台無しになっている場合は、お気軽に修正してください...私は制約に慣れていません。