Actualmente estoy tratando de crear una base de datos sqlite donde puedo importar una tabla desde otra base de datos sqlite (no puedo adjuntar) y agregar algunos datos adicionales a cada columna.INSERTAR O REEMPLAZAR + clave externa ELIMINAR CASCADA funciona demasiado bien
ya que no hay INSERT OR UPDATE
me ocurrió esto:
Estaba pensando en dividir los datos en dos tablas y unirse a ellos después, así que sólo puedo volcar toda la importación en una tabla reemplazar todo lo que ha cambiado y gestionar el extra datos por separado ya que eso no cambia en la importación.
La primera tabla (vamos a llamarlo base_data
) se vería como
local_id | remote_id | base_data1 | base_data2 | ...
---------+-----------+------------+------------+----
además de la local_id
todo lo que acaba de ser un espejo de la base de datos remota (probablemente voy a añadir una marca de tiempo de sincronización, pero eso no importa ahora).
La segunda tabla se vería similar pero tiene remote_id
conjunto como clave externa
remote_id | extra_data1 | extra_data2 | ...
----------+-------------+-------------+----
CREATE TABLE extra_data (
remote_id INTEGER
REFERENCES base_data(remote_id)
ON DELETE CASCADE ON UPDATE CASCADE
DEFERRABLE INITIALLY DEFERRED,
extra_data1 TEXT,
extra_data2 TEXT,
/* etc */
)
Ahora mi idea era simplemente INSERT OR REPLACE INTO base_data ...
valores porque la base de datos puedo importar archivos desde no tiene ninguna marca de tiempo de sincronización o en absoluto y yo tendría que comparar todo para averiguar qué fila tengo para UPDATE
/qué a INSERT
.
Pero aquí está el problema: INSERT OR REPLACE
es en realidad un DELETE
seguido de un INSERT
y la parte de eliminación activa la clave externa ON DELETE
el que pensé que podría evitar que al hacer la restricción DEFERRED
. No funciona si envuelvo INSERT OR REPLACE
en una transacción. Siempre borro mis datos extra, aunque existe la misma clave externa después de la declaración.
¿Es posible detener ON DELETE
para disparar hasta que se termine INSERT OR REPLACE
? Tal vez algún modo de transacción especial/pragma?