我正在使用Postgres,并希望进行一个从CSV文件中获取的大更新查询,假设我得到了一张表(id, banana, apple).
我想运行一个更新香蕉而不是苹果的更新,每个新香蕉及其ID都将在CSV文件中.
我试着查看Postgres网站,但是这些例子正在扼杀我.
在这里,我尝试创建视图,如下所示:
例:
create view view1
as
select table1.col1,table2.col1,table3.col3
from table1
inner join
table2
inner join
table3
on
table1.col4 = table2.col5
/* Here col4 of table1 is of "integer" type and col5 of table2 is of type "varchar" */
/* ERROR: operator does not exist: integer = character varying */
....;
Run Code Online (Sandbox Code Playgroud)
注意:在sql server中执行相同的查询但在postgreSQL中遇到上述错误.
我正在编写一个Django-ORM增强版,它尝试缓存模型并推迟模型保存直到事务结束.这几乎已经完成,但是我在SQL语法中遇到了意想不到的困难.
我不是一个DBA,但据我所知,数据库并不能真正有效地处理许多小问题.几个更大的查询要好得多.例如,最好使用大批量插入(比如一次100行)而不是100个单行.
现在,从我所看到的,SQL并没有真正提供任何语句来对表执行批量更新.这个词似乎令人困惑,我会解释我的意思.我有一个任意数据数组,每个条目描述一个表中的一行.我想更新表中的某些行,每个行都使用数组中相应条目的数据.这个想法非常类似于批量插入.
例如:我的表可以有两列"id"和"some_col".现在描述用于在批处理更新的数据阵列由三个条目的(1, 'first updated'),(2, 'second updated')和(3, 'third updated').更新前表中包含行:(1, 'first'),(2, 'second'),(3, 'third').
我来到这篇文章:
这似乎做我想要的,但我最终无法弄清楚语法.
我还可以删除所有需要更新的行,并使用批量插入重新插入它们,但我发现很难相信这实际上会更好.
我使用PostgreSQL 8.4,因此这里也可以使用一些存储过程.然而,当我计划最终开源项目时,任何更便携的想法或方法在不同的RDBMS上做同样的事情是最受欢迎的.
后续问题:如何批量"插入或更新"/"upsert"语句?
检测结果
我已经执行了100次10次插入操作,分布在4个不同的表中(总共1000个插入).我使用PostgreSQL 8.4后端在Django 1.3上进行了测试.
这些是结果:
结论:在单个connection.execute()中执行尽可能多的操作.Django本身带来了巨大的开销.
免责声明:除了默认主键索引之外,我没有引入任何索引,因此插入操作可能会因此而运行得更快.
postgresql ×3
database ×2
sql ×2
casting ×1
csv ×1
file-io ×1
insert ×1
integer ×1
sql-update ×1
varchar ×1