Your C++ application is not using a good database approach. I suggest you to work around this behaviour with views and triggers.
Example:
Your main tables become T1
and T2
:
CREATE TABLE T1(ID, T1_NAME, T1_VALUE);
CREATE TABLE T2(ID, ID_T1, T2_NAME, T2_VALUE);
Those ID
become fixed! You should not change them!
Next, auxiliary views, mapping real ID
to dynamic ones:
CREATE VIEW T1_IDX AS SELECT DISTINCT ID, (SELECT COUNT() FROM (SELECT DISTINCT ID FROM T1 AS _ WHERE ID<T1.ID)) AS ID_T1 FROM T1;
CREATE VIEW T2_IDX AS SELECT DISTINCT ID, (SELECT COUNT() FROM (SELECT DISTINCT ID FROM T2 AS _ WHERE ID<T2.ID)) AS ID_T2 FROM T2;
TABLE_1
and TABLE_2
become emulated as views:
CREATE VIEW TABLE_1 AS
SELECT ID_T1, T1_NAME, T1_VALUE FROM T1
JOIN T1_IDX ON T1.ID=T1_IDX.ID;
CREATE VIEW TABLE_2 AS
SELECT ID_T2, T1_IDX.ID_T1 AS ID_T1_IN_T2, T2_NAME, T2_VALUE FROM T2
JOIN T2_IDX ON T2.ID=T2_IDX.ID
JOIN T1_IDX ON T2.ID_T1=T1_IDX.ID;
And DELETE
statement on TABLE_1
become mapped with following TRIGGER
:
CREATE TRIGGER TABLE_1_DELETE INSTEAD OF DELETE ON TABLE_1 BEGIN
DELETE FROM T2 WHERE ID_T1 = (SELECT ID FROM T1_IDX WHERE ID_T1=OLD.ID_T1);
DELETE FROM T1 WHERE ID = (SELECT ID FROM T1_IDX WHERE ID_T1=OLD.ID_T1);
END;
With this automation, your C++ application will see TABLE_1
with computed indexes, not real ones, and DELETE
operation is handled by SQLite engine to operate on real tables.
Note: other operations on views, beyond SELECT
and DELETE FROM TABLE_1
, if needed, must be implemented as triggers!