Детско-родительские ограничения в MYsql? - PullRequest
0 голосов
/ 08 февраля 2012

Могу ли я получить их?

У меня есть ограничение, которое вынуждает удалить строку, если удаляется связанная строка из другой таблицы:

node INT UNSIGNED NOT NULL,
id INT UNSIGNED NOT NULL AUTO_INCREMENT,   
name VARCHAR(20) NOT NULL,     
title VARCHAR(200) NOT NULL,
description MEDIUMTEXT,
category VARCHAR(20) NOT NULL,  
parent INT UNSIGNED DEFAULT 0,             # here is the parent term id
                                           # if it's 0 the term has no parent

PRIMARY KEY(id),
UNIQUE KEY(name, node, category),
KEY parent(parent),
KEY category(category),

CONSTRAINT terms FOREIGN KEY(node)
    REFERENCES nodes(id) ON DELETE CASCADE ON UPDATE RESTRICT

Я хочу другое ограничение, которое вынуждаетавтоудаление строки, если «родительский» термин удален?(если есть родительский набор терминов)

Пример:

node  |  id  |  name  | title   | description    | category | parent
___________________________________________________________________
534   |    1 |  A     | Foooooo | Bla bla...     | A        | 0 
54    |    2 |  B     | Foooooo | Bla bla...     | A        | 1
45    |    3 |  C     | Foooooo | Bla bla...     | A        | 2
545   |    4 |  D     | Foooooo | Bla bla...     | A        | 2
534   |    5 |  E     | Foooooo | Bla bla...     | A        | 1

, поэтому термины выглядят так:

  A
  - B
  --- C
  --- D
  - E

Итак, если я удаляю B, я хочу C иD также будет удален, если я удалю A, то B, C, D, E должны быть удалены ...

Ответы [ 2 ]

3 голосов
/ 08 февраля 2012

Не существует такого понятия, как «условное» ограничение: Либо ваше родительское поле всегда ссылается на другую строку (т. Е. 0 не допускается), либо оно вообще не является ограничением.

Это вполне нормальный вариант использования, обычно вы обходите его с ON DELETE TRIGGER на родителе, который также удаляет потомков, выбирая их по родителю.

В вашем примере вы можете рассмотреть что-то вроде

CREATE TRIGGER cascade_delete_children 
    BEFORE DELETE ON node 
    FOR EACH ROW 
         DELETE FROM node WHERE parent=OLD.id;
2 голосов
/ 08 февраля 2012

Вы можете использовать NULL вместо 0 и определить FOREIGN KEY с каскадным удалением:

parent INT UNSIGNED NULL DEFAULT NULL,    --- here is the parent term id
                                          --- if it's NULL the term has no parent
...

CONSTRAINT parent_fk FOREIGN KEY(parent)
    REFERENCES thisTable(id) 
        ON DELETE CASCADE 
        ON UPDATE RESTRICT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...