2010-11-23 2 views
1

Я немного MySQL noob, поэтому, пожалуйста, несите меня, я пытаюсь найти способ сохранить что-то в Parent Table и потребовать хотя бы одной дочерней таблицы иметь внешний ключ связанный с ним. Надеюсь, пример имеет смысл.MySQL Хранить данные до тех пор, пока не будут привязаны дочерние таблицы

      Parent Table 
         ------------ 
         theId int 
         someValue varchar(20) 
        /  |   \ 
        /  |    \ 
        /  |    \ 
Open Table  / Completed Table  \ Monitoring Table 
------------------/ ------------------  ------------------ 
childTableId int   childTableId int  childTableId int 
someOtherData blob  someOtherData blob  someOtherData blob 
theId int (fk)   theId int (fk)   theId int(fk) 

Я имею 3 ребенка данных и все отслеживать разные вещи, и эти записи присутствуют только в течение определенного времени, однако родительская таблица всегда одинакова на всех этапах. Мне нужен способ убедиться, что дочерние данные не могут быть удалены, если это единственная дочерняя таблица, ссылающаяся на родительскую таблицу (время от времени может быть 2).

Помощь?

+0

хранить счетчик в родительской таблице и вставлять/делить их при добавлении и удалении дочерних строк? TBH Я не понимаю ваш вопрос: P – 2010-11-23 15:37:54

ответ

1

В зависимости от мероприятия (открытый, завершен, мониторинг), вы будете называть один из них:

DELETE FROM Open 
WHERE theId = 'yourId' 
AND theId IN 
    (SELECT theId FROM Completed) UNION ALL 
    (SELECT theId FROM Monitoring); 

DELETE FROM Completed 
WHERE theId = 'yourId' 
AND theId IN 
    (SELECT theId FROM Open) UNION ALL 
    (SELECT theId FROM Monitoring); 

DELETE FROM Monitoring 
WHERE theId = 'yourId' 
AND theId IN 
    (SELECT theId FROM Open) UNION ALL 
    (SELECT theId FROM Completed); 

Это приведет к удалению записи только если идентичный theId находится в другой таблице. Вы должны запустить это в рамках транзакции. В противном случае несколько пользователей могут одновременно удалять запись с одинаковыми theId в разных таблицах.

+0

Так что мне просто нужно изменить выражения select, чтобы добавить `WHERE theId = 1` или что-то еще, так как я хочу удалить строки выбора не все строки? – 2010-11-23 15:32:36

Смежные вопросы