我有一个具有常量行数的SQLite表。但是当我生成从其中一些列(新功能)派生的值时,我希望在现有列的同时添加列,而不创建任何新行。我可以使用ALTER TABLE
添加列,但调用cur.executemany("INSERT INTO...")
会导致值附加到新行中。
我试过了:
cur.executemany("UPDATE DOS_APPENDIX SET FEATURE2=?", [(val,) for val in ["a", "b", "c"]])
由于某种原因,这会导致" c"要在列FEATURE2
中的第1,2,3行中重复。它在一个大的名单上很慢(约200万)。
有没有办法进行批量更新?像调用cur.executemany(INSERT INTO...)
那样优雅而快速的东西?
我是否必须使用for
循环逐个更新行?
如果是这样,如果我没有WHERE
条件(只有行号),我该怎么做?
注意:并行列与现有列一起创建时带有空值。然后这些被覆盖。
答案 0 :(得分:3)
在关系数据库中,您可能不想做您所描述的内容,因为它会中断normalization。
我建议您有一个功能表,用于存储每行的功能:
CREATE TABLE observations (id INTEGER);
CREATE TABLE features (id INTEGER, name TEXT);
CREATE TABLE values (row_id INTEGER, feature_id INTEGER, value FLOAT);
这样,您可以通过向features
表添加一行以及向values
表添加所有相应行来添加新功能。
答案 1 :(得分:2)
UPDATE tbl SET column='value'
,则会在value
的所有行中获得column
。这正是此查询的作用。如果要仅在特定行(或特定列)上设置值,则应相应地更改查询(使用where column1='some value'
或更改列名称。
cur.executemany("UPDATE DOS_APPENDIX SET column2=? WHERE column1=?", [(column2_val, column1_val) for ...])
一般情况下 - 当你说“我没有WHERE
条件(只有行号)”时 - 这是非常有问题的。如果您确切知道要更新哪些行,则可以使用limit
,但行的顺序可能会发生变化,因此我建议您不要这样做。向您的行添加id
并将其与UPDATE
查询一起使用会更好。