SQLite - файл:Скопируйте все значения из предыдущей строки с одной подстановкой
Вопрос
Используя SQLite, мне нужно скопировать почти всю существующую строку из таблицы, внести изменения в один столбец и вставить новую строку в таблицу.Что-то примерно похожее
INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ... , cn) FROM $tablenam
Я попытался подставить некоторое значение ci в список выбранных столбцов.Это работает, если значение является числом с плавающей запятой или целым числом, но не если это строка.Если значение является строкой, SQLite интерпретирует его как имя столбца, которого, естественно, не существует, и я получаю сообщение об ошибке.
Я могу написать код для выполнения этой операции, но я надеялся сделать это в одном запросе.
Если это имеет значение, то в настоящее время я пишу на tcl.
Спасибо,
Шон
Решение
Ты хочешь сказать, что это не сработает?
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")
пока это работает, потому что "
around othervalue включены в экранированный формат, и тогда sqllite должен распознать его как выражение, а не как columnname
dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")
Другие советы
Убедитесь, что вы заключили строку в 'singlequotes'
.Я нахожу, что они лучше подходят для цитирования строк в SQL-запросах, чем двойные цитаты.Убедитесь, что они тоже сбежали.
Я не знаю, поддерживает ли tcl параметризованные запросы или нет.Использование параметризованных запросов в sqlite имеет три преимущества.
- Это предотвращает атаки с использованием sql-инъекций.
- Тебе не нужно беспокоиться о "и".Больше никакого цитирования кавычек или экранирования кавычек.
- Это быстрее, потому что sqlite не нужно повторно обрабатывать каждый оператор sql при использовании параметров.(Смотрите эту ссылку для примера производительности Как мне обойти проблему "'" в sqlite и c #? ).