Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

[SOLUCIONADO]  Dudas sobre tablas relacionadas y SQLite3
#1

Hola

Estoy empezando a conocer en profundidad SQLite3 pero observo que contra mas se, veo que la meta en el conocimiento se me aleja cada vez más.

Ahora mi duda es sobre los errores que se suponen las base de datos dan cuando existe relaciones en cascadas (esto es cuando una tabla digamos cabecera tiene una relación con otra tabla digamos le detalle de cabecera y cuando queremos borrar la cabecera el sistema de base de datos nos informa que existen registros relacionados (tabla detalle de cabecera) con la tabla cabecera y el programador sabe de esta forma que debe actuar en consecuencia para evitar el error de relación en cascada)

¿Existe esto en SQLite3?
¿Como se conoce estos mecanismos como programador y cuales son sus mecanismos?
¿Alguna guía o ejemplo?

Gracias.
    ¡Gracias!
#2

Hola

Esto es lo que encontré en Google:

https://parzibyte.me/blog/2019/05/29/rel...-foraneas/

Sqlite3 tiene soporte para claves foráneas y relaciones entre tablas, pero también he leído que no tiene integridad referencial. Eso significaría que las modificaciones sobre tablas que referencian a otras tendrías que resolverlas manualmente por ejemplo cuando borres un registro con FK.

Pero seguro que alguien mas experto puede contestar con mejor criterio.

Saludos

Por favor, usa el corrector ortográfico antes de pulsar el botón 'Enviar'
[-] Los siguientes 1 usuarios dice gracias a jguardon por este post:
  • gambafeliz
    ¡Gracias!
#3

Creo que si tiene integridad referencial, pero tienes que activarla en cada conexión, no está activa por defecto.


Conexion.Exec("PRAGMA foreign_keys = ON") ' activar en cada conexion, en sqlite foreign_keys esta desactivado
[-] Los siguientes 1 usuarios dice gracias a angelnu por este post:
  • gambafeliz
    ¡Gracias!
#4

Gracias angelnu muy interesante tu apunte y tienes toda la razón, yo no lo sabia y me viene muy bien saberlo. He realizado esto para testear tu nota informativa y es totalmente cierta.

En el monitor a parte de cargar la base de datos en SQLite3 he puesto este comando ya dentro de SQLite:

.dbconfig

y me ha devuelto justo lo que tu dices y es que por defecto esta en off:

enable_fkey off (esto es igual a decir que la clave foránea esta desactivada por defecto)

y tan solo con poner:

.dbconfig enable_fkey on

Ahora también esta en on

Espero que con tu aporte y el mio quede todo aclarado este tema.

Saludos.
    ¡Gracias!
#5

Buenas!!

SQLite si tiene integridad referencial, para manejar las Foreign Key (FK) tienes que tener varias cosas en cuenta:
  • Por compatibilidad con versiones anteriores están desactivadas por defecto, como bien dice Angelnu. Hay que activarlas por conexión con el PRAGMA.
  • A la hora de crear una FK en la base de datos puedes:
    • Controlar el "cuando", clasificarlas como inmediatas o diferidas, por defecto son inmediatas a no ser que uses DEFERRABLE al crearlas. Afecta al momento en que funcionan, las inmediatas en cuanto haces un INSERT fallan, las diferidas te dejan hacer INSERT pero cuando haces COMMIT dan error si no hay integridad referencial, dejando la transacción sin completar.
    • Controlar el "cómo", darles un comportamiento en el borrado (ON DELETE) o en la actualización (ON UPDATE). Y tienes también varias opciones:
      • NO ACTION: pues eso, que no haga nada, es la opción por defecto.
      • RESTRICT: ni actualizas ni borras en la tabla padre si hay registros dependientes.
      • SET NULL: el campo FK en la tabla hija se pone a NULL si borras o modificas la tabla padre.
      • SET DEFAULT: igual que el anterior pero en vez de NULL usa el valor DEFAULT del campo.
      • CASCADE: Actualiza o borra todos los registros de la tabla hija.
  • Tipos de tablas referenciadas, no es lo mismo tener una FK a una tabla auxiliar que a una tabla normal. Por ejemplo, si tengo una tabla de prendas de ropa con una FK a una tabla de colores, no poner un CASCADE, borras el rojo y borras todos los artículos de ese color. Mejor un SET DEFAULT o SET NULL. Si tienes una tabla de facturas y una con las lineas de detalle de las facturas (o pedidos, albaranes, ....), pones un CASCADE, al borrar la factura borras sus lineas de detalle.
Hay más matices, para más información:
SQLite Foreign Keys

Un saludo.
    ¡Gracias!
#6

Gracias Harpo voy hacer los ejemplos que me has mandado en el enlace e investigaré como se usa las relaciones en SQLite.

Saludos.
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)