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