2009-06-30 2 views
2

Использование SQLite Мне нужно скопировать почти всю существующую строку из таблицы, внести изменения в один столбец и вставить новую строку в таблицу. Что-то примерно наподобиеSQLite: скопировать все значения из предыдущей строки с одной подстановкой

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

Я попытался подставить некоторое значение ci в список столбцов SELECT. Это работает, если значение является float или integer, но не является строкой. Если значение представляет собой строку, SQLite интерпретирует ее как имя столбца, которая, естественно, не существует, и я получаю сообщение об ошибке.

Я могу написать код для выполнения этой операции, но я надеялся сделать это в одном запросе.

Если это актуальность, в настоящее время я кодирую в tcl.

Спасибо,

Шон

ответ

6

Вы имеете в виду это не работает?

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

Как вы строите запрос?

Псевдокод, например. это не будет работать, как othervalue интерпретируется как ColumnName

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

в то время как это работает, потому что " вокруг othervalue включены в экранированном формате, а затем sqllite должны признать его как выражение не больше, как ColumnName

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

Как упоминалось в вопросе, это работает, если «othervalue» - это число, оно не работает, если «othervalue» является строкой, потому что SQLite интерпретирует строку как не- существующее имя столбца (я получаю «столбец« другое значение »не существует») – Sean

+0

Спасибо. Все работает сейчас. Мне просто нужно было правильно избежать кавычек, чтобы они присутствовали в запросе. – Sean

+0

Что происходит, когда строка othervalue содержит "или a"? Вы должны проверить это дело. – Theo

0

Убедитесь, что вы окружили строку в 'singlequotes'. Я нахожу, что они работают лучше для цитирования строк в SQL-запросах, чем двойных. Удостоверьтесь, что они тоже ускользнули.

+0

Спасибо. Цитирование цитат работает (и имеет смысл). – Sean

0

Я не знаю, поддерживает ли tcl параметризованные запросы или нет. Использование параметризованных запросов в sqlite имеет три преимущества.

  1. Он предотвращает атаки с использованием блока sql.
  2. . Вам не нужно беспокоиться о «и». Больше не цитирует цитаты или кавычки котировок.
  3. Это быстрее, потому что sqlite не требует повторной обработки каждого оператора sql при использовании параметров. ссылка для примера производительности How do I get around the "'" problem in sqlite and c#?)
Смежные вопросы