gambafeliz   11-04-2022, 11:12
#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.
Última modificación: 11-04-2022, 14:45 por gambafeliz.
jguardon   11-04-2022, 13:19
#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'
angelnu   11-04-2022, 21:12
#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
gambafeliz   12-04-2022, 10:43
#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.
Harpo   13-04-2022, 12:28
#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.
gambafeliz   13-04-2022, 17:56
#6
Gracias Harpo voy hacer los ejemplos que me has mandado en el enlace e investigaré como se usa las relaciones en SQLite.

Saludos.
  
Usuarios navegando en este tema: 2 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.