SQLite: Copia todos los valores de una fila anterior con una sustitución
Pregunta
El uso de SQLite que necesito copiar casi la totalidad de una fila existente de una tabla, realizar un cambio en una sola columna, e insertar la nueva fila en la tabla. Algo más o menos como
INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ... , cn) FROM $tablenam
He intentado la sustitución de un cierto valor de CI en el la lista de columnas SELECT. Esto funciona si el valor es un flotador o un número entero, pero no si se trata de una cadena. Si el valor es una cadena, SQLite interpreta como un nombre de columna, lo que naturalmente no existe y me sale un error.
Puedo escribir código para realizar esta operación, pero esperaba hacerlo en una sola consulta.
Si de relevancia, actualmente estoy de codificación en TCL.
Gracias,
Sean
Solución
¿Quiere decir esto no funciona?
INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ..., "othervalue", ... , cn) FROM $tablename
¿Cómo está construyendo su pregunta?
pseudocódigo por ejemplo esto no funcionará como se interpreta como othervalue nombrecolumna
dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ..., othervalue, ... , cn) FROM $tablename")
Aunque esto funciona, porque el "
alrededor othervalue se incluyen en formato de escape y luego SQLLite debe reconocerlo como expresión ya no como nombrecolumna
dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")
Otros consejos
Asegúrese de que ha rodeado a la cadena en 'singlequotes'
. Me parece que funcionan mejor en la cotización de las cadenas en las consultas SQL que comillas dobles. Asegúrese de que están escaparon también.
No sé si TCL soporta consultas con parámetros o no. El uso de consultas con parámetros en SQLite tiene tres ventajas.
- Previene ataques de inyección SQL.
- Usted no tiene que preocuparse acerca de "y". No más cita de cotizaciones o escapar de las comillas.
- Es más rápido porque SQLite no tiene reanálisis de cada sentencia SQL cuando se utiliza parámetros. (Ver este enlace para un ejemplo de rendimiento ¿Cómo consigo alrededor del "'" problema de SQLite y C #? ).