SQLite - файл:Скопируйте все значения из предыдущей строки с одной подстановкой

StackOverflow https://stackoverflow.com/questions/1065534

Вопрос

Используя 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 имеет три преимущества.

  1. Это предотвращает атаки с использованием sql-инъекций.
  2. Тебе не нужно беспокоиться о "и".Больше никакого цитирования кавычек или экранирования кавычек.
  3. Это быстрее, потому что sqlite не нужно повторно обрабатывать каждый оператор sql при использовании параметров.(Смотрите эту ссылку для примера производительности Как мне обойти проблему "'" в sqlite и c #? ).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top