SQLite:使用一次替换复制上一行中的所有值

dgtucam1  于 2023-02-09  发布在  SQLite
关注(0)|答案(3)|浏览(153)

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

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

我试着用一个值ci替换SELECT列的列表,如果值是浮点数或整数,这个方法就有效,但是如果值是字符串,SQLite就把它解释为列名,而列名自然不存在,我得到一个错误。
我可以编写代码来执行此操作,但我希望在一个查询中完成此操作。
我目前正在编写Tcl代码。

zzlelutf

zzlelutf1#

你的意思是这不管用?

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应该将其识别为表达式,而不再是列名

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

iaqfqrcu2#

确保你已经用'singlequotes'把字符串括起来了。我发现在SQL查询中用双引号把字符串括起来比用双引号更好。确保它们也被转义了。

rbpvctlc

rbpvctlc3#

我不知道tcl是否支持参数化查询,在sqlite中使用参数化查询有三个好处。
1.它可以防止sql注入攻击。
1.你不必担心“和“。没有更多的引号引用或转义引号。
1.它更快,因为当你使用参数时,sqlite不需要重新解析每个sql语句(请看这个链接,以获得一个性能示例,我如何绕过sqlite和c#中的“'”问题?)

相关问题