Prohibición de inserción de enteros que no sean rowid en SQLite (mantener la consistencia de la tabla de grafo dirigido acíclico)
Me gustaría expresar lo siguiente:
“La inserción de un registro con un valor ‘padre’ que no está incluido en ‘rowid’ DESPUÉS DE LA INSERCIÓN está prohibida”.
Mi intención es mantener la consistencia interna de la tabla como un grafo dirigido acíclico, donde cada registro es un nodo que se refiere a su padre (los nodos raíz son sus propios padres). ¿Cómo puedo lograrlo?
Aquí está lo que tengo (usando ‘rowid’ como clave primaria):
CREAR TABLA Heap (
nombre TEXTO VERIFICAR (tipo de (nombre) = ‘texto’)
NO NULO
ÚNICO,
padre ENTERO PREDETERMINADO rowid,
color ENTERO VERIFICAR (color ENTRE 0 Y 2)
);
CREAR DISPARADOR parent_not_in_rowid
ANTES DE INSERTAR EN Heap
COMIENZO
SELECCIONAR RAISE (FAIL, ‘identificador de padre inconsistente’) DE Heap
DONDE NO EXISTE (SELECCIONE 1 DE Heap DONDE NUEVO.rowid = NUEVO.padre);
FIN;
davy.ai
Para mantener la consistencia interna y asegurar que se prohíba la inserción de un registro con valor de padre que no esté incluido en rowid después de la inserción, se puede crear un disparador en SQLite. El disparador debe estar vinculado a la operación de inserción y comprobar si el padre del nuevo registro a insertar existe en la tabla Heap. Si no existe, el disparador debe impedir la inserción utilizando la función RAISE(FAIL). El siguiente disparador logra esto:
Este disparador debe declararse antes de que se inserten datos en la tabla Heap. Con este disparador en su lugar, no se permitirá la inserción de un registro si su padre no es un rowid válido en la tabla Heap. Esto mantendrá la estructura del grafo acíclico dirigido en los datos de Heap y garantizará la integridad referencial.