2010-06-08 1 views
4

중첩 된 범주를 포함하는 테이블이 있습니다. 동일한 수준의 항목 (즉, 동일한 상위 항목이있는 카테고리)에 중복 된 이름이 표시되지 않도록하고 싶습니다. 나는이 함께했습니다null이 허용되는 열의 고유 제한

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

합리적인 해결 방법은 업데이트/삽입 작업이 null을 나타 내기 위해 특수 값의 일종을 사용하여 속도

  • 중요하지 않은 경우

    • 트리거와 제약을 체크하기 포함 할 수 있습니다; ,, 삭제되지 않습니다 ID 0에 루트 노드가 DEFAULT 0 데이터베이스 측에
  • +0

    아니요 MySQL에서'ON DELETE SET DEFAULT'가 없습니다. ( –

    +0

    아, 참으로 ... 파서에 의해 인식되었지만 거부되었습니다 : "SET DEFAULT :이 동작은 파서에 의해 인식되지만 InnoDB는 테이블을 거부합니다 – Unreason

    +0

    MySQL의 트리거는 영향을받는 테이블의 다른 행을 변경할 수 없습니다. –

    2

    가 최대한 멀리 볼 수있는, 시행하는 DELETE SET의 DEFAULT ON을 PARENT_ID 한 -이 비교적 적절하게 모델링 할 수있다 가능성 :

    1. 는 루트 노드에 추가하는 '루트'노드를 정의가 아닌 'new 'rootNode를, 허용 또는
    2. 업데이트 전에의 삽입 전에 추가 trirgger

    BTW : 부모 삭제 categ ories가 루트 카테고리로 승격되면 원하는 것입니까?

    +0

    «상위 삭제 범주는 루트 범주로 승격되며, 원하는 것은 무엇입니까?»- 짧은 대답, 예. 아마도 개발이 진행되면서 그것을 바꿀 것입니다. 그러나 MySQL이 그것을 처리하고 싶다면 트리거를 작성해야한다고 생각합니다. –

    +0

    난 그냥 루트 수준에서 잘까 수 있도록 할거야. 어쨌든 삭제 코드가 간단 해집니다. –