2016-07-29 3 views
1

Я прочитал документацию для каскадного удаления, но одна вещь, о которой я не знаю, - это то, что можно создать базу данных, чтобы дочерняя строка могла делиться более чем один родительский элемент и дочерняя строка удаляются только после удаления ссылки на родительскую строку?SQLite удаляет общую строку при удалении последней ссылки на нее

(В основном я хочу внешние ключи, которые действуют как станд :: shared_ptr.)

Если это не представляется возможным с помощью встроенных в каскадном удалении настроек, это можно сделать с помощью триггера? Как это будет выглядеть?

Окончательный вариант, который у меня есть, заключается в том, что, хотя это возможно в библиотеке, которую я пишу, чтобы создать эту ситуацию с общей ссылкой, я мог бы просто заставить ее генерировать исключение, когда происходит попытка построить такую ​​вещь ,

В частности, у меня есть таблица саморегуляции, в которой хранится нечто вроде абстрактного дерева синтаксиса. Каждый узел имеет операцию и два дочерних узла. В моей программе на C++, которая использует базу данных, объекты, представляющие строки в этой таблице, имеют перегруженные операторы, которые возвращают значения, которые одновременно приводят к созданию строк в таблице. Например, «a < < b» вернет временное значение «c», и в базе данных будет строка типа: (c_id, '< <', a_id, b_id). Однако вы могли бы следовать этому при вызове «a < < x», и в этом случае база данных будет содержать две строки, ссылающиеся на «a».

Классы C++ записываются для вставки строки таблицы в свой конструктор и удаления строки таблицы в их деструкторе. По сути, я хочу, чтобы создание и уничтожение временных объектов в коде C++ отражалось в состоянии базы данных. Но я хочу подавить удаление дочерней строки, если на нее по-прежнему ссылается другой родитель.

ответ

1

Это возможно с помощью trigger.

Когда нет родителей с тем же ребенком слева, удалить ребенок:

CREATE TRIGGER t 
AFTER DELETE ON Parent 
WHEN NOT EXISTS (SELECT 1 FROM Parent WHERE ChildID = OLD.ChildID) 
BEGIN 
    DELETE FROM Child WHERE ID = OLD.ChildID; 
END; 
Смежные вопросы