2

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

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

我尝试将某个值 ci 替换为 SELECT 列的列表。如果值是浮点数或整数,则此方法有效,但如果它是字符串,则无效。如果值是字符串,SQLite 将其解释为列名,自然不存在,我得到一个错误。

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

如果相关,我目前正在使用 tcl 进行编码。

谢谢,

肖恩

4

3 回答 3

6

你的意思是这行不通?

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

你是如何构建你的查询的?

伪代码,例如这将不起作用,因为 othervalue 被解释为列名

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

虽然这可行,因为"周围的 othervalue 包含在转义格式中,然后 sqllite 应该将其识别为表达式而不是列名

dothquery("INSERT INTO $tablename (c1, c2, ... , cn)
        SELECT (c1, c2, ..., \"othervalue\", ... , cn) FROM $tablename")
于 2009-06-30T19:32:38.217 回答
0

确保您已将字符串包围在'singlequotes'. 我发现它们在 SQL 查询中引用字符串比双引号更有效。确保他们也逃脱了。

于 2009-06-30T19:36:32.703 回答
0

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

  1. 它可以防止 sql 注入攻击。
  2. 您不必担心 ' 和 "。不再引用引号或转义引号。
  3. 它更快,因为当您使用参数时,sqlite 不必重新解析每个 sql 语句。(有关性能示例,请参阅此链接如何解决 sqlite 和 c# 中的“'”问题?)。
于 2009-07-01T07:39:49.597 回答