SQLite: скопировать все значения из предыдущей строки с одной заменой

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

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

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

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

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

Спасибо,

Шон


person Sean    schedule 30.06.2009    source источник


Ответы (3)


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

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

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

псевдокод это не будет работать, так как другое значение интерпретируется как имя столбца

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

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

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")
person jitter    schedule 30.06.2009
comment
Как упоминалось в вопросе, это работает, если другое значение является числом; это не работает, если другое значение является строкой, потому что SQLite интерпретирует строку как несуществующее имя столбца (я получаю столбец «другое значение» не существует ошибок). - person Sean; 30.06.2009
comment
Спасибо. Теперь все работает. Мне просто нужно было правильно экранировать кавычки, чтобы они присутствовали в запросе. - person Sean; 30.06.2009
comment
Что происходит, когда строка othervalue содержит a или '? Вы должны проверить этот случай. - person Theo; 01.07.2009

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

person J. Polfer    schedule 30.06.2009

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

  1. Это предотвращает атаки SQL-инъекций.
  2. Вам не нужно беспокоиться о ' и ". Больше никаких кавычек или экранирования кавычек.
  3. Это быстрее, потому что sqlite не нужно повторно анализировать каждый оператор sql при использовании параметров. (См. эту ссылку для примера производительности ">Как мне обойти проблему в sqlite и c#?).
person Theo    schedule 01.07.2009