2010-06-08 122 views
4

我有一個擁有嵌套類別的表。我想避免同級別項目上的重複名稱(即具有相同父級的類別)。我來到這個:可空列的唯一約束

CREATE TABLE `category` (
    `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `category_name` varchar(100) NOT NULL, 
    `parent_id` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`category_id`), 
    UNIQUE KEY `category_name_UNIQUE` (`category_name`,`parent_id`), 
    KEY `fk_category_category1` (`parent_id`,`category_id`), 
    CONSTRAINT `fk_category_category1` FOREIGN KEY (`parent_id`) REFERENCES `category` (`category_id`) ON DELETE SET NULL ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci 

不幸,category_name_UNIQUE不強制我的根級類別規則(那些parent_id是NULL)。有沒有合理的解決方法?

回答

5

合理的解決方法可能包括

  • 與觸發器檢查約束,如果更新/插入操作不使用某種特殊的價值表示零速度
  • 關鍵;這可能是相對適當的建模 - 有一個ID爲0的根節點永遠不會被刪除,有parent_id默認爲0和ON刪除設置默認
+0

在MySQL中沒有'ON DELETE SET DEFAULT',恐怕:( – 2010-06-08 12:01:30

+0

啊,確實...被解析器識別,但被拒絕:「SET DEFAULT:這個動作被解析器識別,但InnoDB拒絕表定義包含ON DELETE SET DEFAULT或ON UPDATE SET DEFAULT子句。「嗯,你可以在觸發器中實現級聯。 – Unreason 2010-06-08 12:30:28

+0

MySQL中的觸發器不允許改變受影響表中的其他行 – 2010-06-10 08:15:29

2

據我所知,執行是在數據庫端,可能性:

  1. 定義一個「根」節點,只添加到根節點是允許的,而不是'new」根節點,或
  2. 更新之前的插入物之前添加trirgger

順便說一句:在父刪除類別上ories被提升爲根類別,那是你想要的嗎?

+0

«關於父母刪除類別被提升爲根類別,那是你想要的嗎?» - 簡短的回答,是的。如果我希望MySQL爲我處理它,我可能會隨着開發的進展而改變它,但我想我需要編寫一個觸發器。 – 2010-06-08 11:51:04

+0

我想我只會允許在根級別進行欺騙。無論如何,這簡化了刪除代碼。 – 2010-06-10 08:16:29