当父行链接到子行时

时间:2015-01-17 12:46:39

标签: php mysql sql

示例:我的类别表包含同一个表的FOREIGN KEY:

 CREATE TABLE `categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`parent_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `categories_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`)
)

如何约束parent_id,它不能是子parent_id。

实施例: 我们有一个父级的行,其中parent_id等于孩子的id:

['1', 'parent_name', '**2**']

子行:

['2', 'child_name', '**1**']

如何通过MySQL解决这个问题?

1 个答案:

答案 0 :(得分:1)

在插入过程中已经没有发生过(基于表的定义),你有 parent_id 的外键到 id 你的例子是一个悖论,但它可能在表的更新期间发生,因此您需要为Update创建触发器以防止更新表,例如示例也适用于此情况CHECK约束不行,因为我提到过一种方法是使用trigger before update

CREATE TRIGGER trigger_categories
BEFORE Update
   ON categories FOR EACH ROW

BEGIN
    DECLARE msg VARCHAR(255);
    IF EXISTS (select * from categories c where c.id=NEW.parent_id and c.parent_id=NEW.id) THEN
       set msg = "DIE: you can not make a parent of chield as it's chield...";
       SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
       // also you can make NEW as NULL for preventing update under mentioned condition
    END IF;    
END;