示例:我的类别表包含同一个表的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解决这个问题?
答案 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;