使用 SQLite,我需要从表中复制几乎所有现有行,对单个列进行更改,然后将新行插入表中。大致类似于

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

我尝试将某个值 ci 替换到 SELECT 列的列表中。如果该值是浮点数或整数,则此方法有效,但如果它是字符串,则此方法无效。如果该值是一个字符串,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")

而工作的,因为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