es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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;

Tags:  , , , ,

Answer

  1. Avatar for 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:

    CREATE TRIGGER parent_not_in_rowid
    BEFORE INSERT ON Heap
    BEGIN
     SELECT RAISE(FAIL, 'parent id inconsistent') FROM Heap
     WHERE NOT EXISTS(SELECT 1 FROM Heap WHERE NEW.parent = rowid);
    END;
    

    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.

Comments are closed.