SQLite In Clause no funciona en el desencadenante

ado.net c# dapper sqlite

Pregunta

tengo dos tablas Table1 y Table2. Table1 tiene ID de columna, ID de cadena y ID de columna de Table2, datos

Hay dos tablas en la foto

He creado un disparador para eliminar filas basadas en la tabla1. no funciona si la coma Los ID de cadena separados son más de uno. funciona si stringIDs es solo un valor único

create trigger tgTriggerName after delete
on Table1
begin
delete from Table2 where ID in (old.stringIDs);
end

Respuesta aceptada

'stringIDs' de la tabla 1 guárdelos en otra tabla con la referencia de la clave externa que aplicar el desencadenador en la nueva tabla para borrar los registros de la tabla 2


Respuesta popular

Gordon es correcto, esta estructura de la tabla no es muy probable que lo que quiere. Pero si por alguna razón debe hacerlo de esta manera, esta consulta podría lograr lo que desea:

delete from Table2 
where ID = old.stringIDs                   -- ID matches exactly
  or old.stringIDs like ID + ',%'          -- Or ID is at beginning of list
  or old.stringIDs like '%,' + ID          -- Or ID is at end of list
  or old.stringIDs like '%,' + ID + ',%'   -- Or ID is in middle of list

Pero eso es un desastre. No lo hagas En su lugar, elimine la columna stringIDs de Table1 y agregue una columna a Table1ID llamada Table1ID para indicar a qué Table1 ID pertenece este registro Table1ID . Entonces Table2 se vería así

ID     Table1ID     Data
1      1            some data
2      1            some data
3      2            some data
4      2            some data
5      2            some data
...

Entonces su consulta de activación puede ser simplemente:

delete from Table2
where Table1ID = old.ID

Aún más limpio sería omitir el disparador por completo y hacer un Contstraint de clave externa con eliminación en cascada. Pero tengo la sensación de que es una lección para otro día.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué