SQL: una consulta para insert un nuevo logging o replace solo algunos campos

Mi database es SQLite, pero estoy seguro de que la pregunta se aplica a SQL en general. Diga, tengo una tabla "estudiantes" con columnas "id" (key principal), "nombre", "seleccionado". De vez en cuando necesito actualizar dicha tabla desde la fuente externa, pero solo recibo una tabla de identificadores y nombres. Cuando se produce dicha actualización para cada línea, necesito:

  1. Si no hay una fila con el mismo ID presente, agregue una nueva fila a la tabla con el valor pnetworkingeterminado para "seleccionado"

  2. Si la fila ya existe, actualice solo el campo "nombre", desatornille "seleccionado"

Esto debe hacerse en un lote con una sola consulta con marcadores de position. Además, el caso se simplifica, en realidad necesito escribir un código universal para actualizar un set de tablas, cada una con varios campos para actualizar y varios campos "locales".

Desafortunadamente, no puedo encontrar una forma adecuada de express mi deseo de SQLite. Si utilizo la consulta REEMPLAZAR:

INSERT OR REPLACE INTO students (id, name) VALUES (:id, :name) 

esto borrará el campo "seleccionado", mientras que si uso UPDATE:

 UPDATE students SET name = :name WHERE id = :id 

esto no agregará nuevas filas.

Entonces, ¿cuál es la forma correcta de hacerlo? Tengo la sensación de que me estoy perdiendo algo muy, muy simple, y de que me sentiré muy, muy estúpido cuando tenga la respuesta 🙂

INSERT or REPLACE no es universal. Cada DB tiene su propia syntax (MERGE para SQL Server 2005 y posterior, por ejemplo), y muchos no lo tienen todo. La solución universal para esto es dos declaraciones.

 UPDATE students SET name = :name WHERE id = :id 

seguido por

 INSERT INTO Students (ID, Name) Values (:id,:name) WHERE Not exists (select * from students where ID= :id) 

Usualmente uso LEFT JOIN para INSERT y DELETE y JOIN para las actualizaciones. Tenga en count que sucede como una gran consulta, no para registrar por base de loggings:

 UPDATE T1 FROM T1 JOIN T2 ON T1.PK = T2.PK INSERT T1 SELECT FROM T2 LEFT JOIN T1 ON T2.PK = T1.PK WHERE T1.PK IS NULL DELETE T1 FROM T1 LEFT JOIN T2 ON T1.PK = T2.PK WHERE T2.PK IS NULL