SQLite:使用一个替换复制前一行的所有值

时间:2009-06-30 19:26:48

标签: sqlite insert copy tcl row

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

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

我尝试将一些值ci替换为SELECT列列表。如果值是float或整数,则此方法有效,但如果是字符串则不行。如果值是一个字符串,SQLite会将其解释为列名,这当然不存在,我收到错误。

我可以编写代码来执行此操作,但我希望在一个查询中执行此操作。

如果相关,我目前正在编写tcl。

谢谢,

肖恩

3 个答案:

答案 0 :(得分: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")

虽然这样做,但因为其他值周围的"包含在转义格式中,然后sqllite应该将其识别为表达式而不再是列名

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

答案 1 :(得分:0)

确保您已将'singlequotes'中的字符串包围起来。我发现它们在SQL查询中引用字符串比双引号更好。确保它们也被转义。

答案 2 :(得分:0)

我不知道tcl是否支持参数化查询。在sqlite中使用参数化查询有三个优点。

  1. 它可以防止SQL注入攻击。
  2. 您不必担心'和'。不再引用引号或报价转义。
  3. 它更快,因为在使用参数时,sqlite不必重新解析每个sql语句。 (有关性能示例How do I get around the "'" problem in sqlite and c#?,请参阅此链接)。