我可以将INSERT语句拆分成几个而不重复插入行吗?

时间:2011-03-25 04:46:23

标签: python sql postgresql

我有这样一个INSERT语句:

   mtemp = "station, calendar, type, name, date, time"
   query = "INSERT INTO table (%s) VALUES ( '%s', '%s', '%s', %s, '%s', '%s' );" 
   query = query % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime)
   curs.execute(query, )
   conn.commit()

问题是我无法在此语句中获取变量:mcalendar,mdate,mtime。它们不是常数值。我必须在forloop中访问它们中的每一个。但是,mstation,mtype和mname的值是固定的。我试图将INSERT语句拆分为几个:一个用于forloop中的三个变量中的每一个,一个用于单个forloop中的三个固定值。 forloop基本上是定义何时插入行。我有一个rows1列表和一个rows2列表,rows1是一个完整的记录列表,而rows2缺少其中的一些。我正在检查rows1记录是否存在于rows1中。如果是,则执行INSERT语句,如果没有,则不执行任何操作。

我运行了代码,发现了两个问题:

  1. 插入的行数比预期的多。它应该插入不超过240行,因为每个传感器每天只发生240次。 (我想知道是不是因为我写了太多forloop以便它继续插入行)。现在它已经有超过400个新行。
  2. 在插入到表中的这些新行中,它们只有固定值列中的值。对于我使用单个forloop插入数据的三个,它们根本没有价值。
  3. 希望有人在这里给我一些提示。提前致谢!如果需要,我可以在这里添加更多代码。我甚至不确定我是否在正确的轨道上。

3 个答案:

答案 0 :(得分:1)

我不确定我完全了解你的情况,但这是你需要的那种吗?

伪码

mstation = "foo"
mtype = "bar"
mname = "baz"
mtemp = "station, calendar, type, name, date, time"
queryTemplate = "INSERT INTO table (%s) VALUES ( '%s', '%s', '%s', %s, '%s', '%s' );" 
foreach (mcalendar in calendars) 
    foreach (mdate in dates) 
        foreach (mtime in times) 
            query = queryTemplate % (mtemp, mstation, mcalendar, mtype, mname, mdate, mtime)
            curs.execute(query, )  

答案 1 :(得分:1)

一个INSERT语句始终对应于表中的一个新行。 (当然除非在插入过程中出现错误。)您可以插入一行,然后稍后更新它以添加/更改信息,但不存在拆分INSERT这样的事情。

如果您的查询需要通过更改数据多次执行,则最佳选项为prepared statement。准备好的语句“编译”SQL查询,但留下可以在每次执行时设置的占位符。这样可以提高性能,因为每次都不需要解析语句。你没有指定你用来连接postgres的库,所以我不知道它的语法是什么,但它是值得注意的。

如果您不能/不想使用预准备语句,则必须为每个插入创建一次查询字符串。不要在循环之前替换值,等到创建查询之前全部知道它们。

答案 2 :(得分:0)

以下语法适用于SQL Server 2008,但不适用于SQL Server 2005。

CREATE TABLE Temp (id int, name varchar(10));

INSERT INTO Temp (id, name) VALUES (1, 'Anil'), (2, 'Ankur'), (3, 'Arjun');

SELECT * FROM Temp;

id |  name
------------
1  |  Anil
2  |  Ankur   
3  |  Arjun