Question

En utilisant SQLite je dois copier presque tous d'une ligne existante à partir d'une table, faire un changement à une seule colonne, et insérez la nouvelle ligne dans la table. Quelque chose à peu près comme

INSERT INTO $tablename (c1, c2, ... , cn) 
    SELECT (c1, c2, ... , cn) FROM $tablenam

J'ai essayé la substitution d'une certaine valeur ci dans la la liste des colonnes SELECT. Cela fonctionne si la valeur est un flotteur ou un entier, mais pas si elle est une chaîne. Si la valeur est une chaîne, SQLite interprète comme un nom de colonne, qui naturellement n'existe pas et je reçois une erreur.

Je peux écrire du code pour effectuer cette opération, mais j'espérais le faire dans une requête.

Si la pertinence, je suis codage actuellement tcl.

Merci,

Sean

Était-ce utile?

La solution

Vous voulez dire que cela ne fonctionne pas?

INSERT INTO $tablename (c1, c2, ... , cn)
    SELECT (c1, c2, ..., "othervalue", ... , cn) FROM $tablename

Comment construisez-vous votre requête?

pseudocode par exemple, cela ne fonctionnera pas comme autreValeur est interprété comme columnname

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., othervalue, ... , cn) FROM $tablename")

alors que cela fonctionne, parce que les autreValeur sont autour " inclus dans le format d'échappement et SqlLite devrait le reconnaître comme l'expression non plus comme columnname

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")

Autres conseils

Assurez-vous que vous avez entouré la chaîne dans 'singlequotes'. Je trouve qu'ils fonctionnent mieux pour citer les chaînes dans les requêtes SQL que doublequotes. Assurez-vous qu'ils sont échappés aussi.

Je ne sais pas si tcl supporte les requêtes paramétrées ou non. Utilisation de requêtes paramétrées dans SQLite a trois avantages.

  1. Il empêche les attaques par injection SQL.
  2. Vous n'avez pas à vous soucier "et ». Plus de citation de citations ou d'échapper à des citations.
  3. Il est plus rapide parce que SQLite n'a pas à réanalyser chaque instruction SQL lorsque vous utilisez des paramètres. (Voir ce lien pour un exemple de performance
scroll top