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

2024-09-21 19:34:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个插入声明:

   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缺少其中一些记录。我正在检查rows2记录是否存在于rows1中。如果是,则执行INSERT语句,否则不执行任何操作。在

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

  1. 它插入的行比预期的要多。它应该插入不超过240行,因为每个传感器每天只有240次出现。(我想知道是不是因为我写了太多的forloop,所以它总是插入行)。现在它有400多个新行。在
  2. 在插入到表中的这些新行中,它们只有固定值列中的值。对于我使用单个forloop插入数据的三个,它们根本没有值。在

希望有人能给我一些提示。提前谢谢!如果需要的话,我可以在这里放更多的代码。我甚至不知道我是否在正确的轨道上。在


Tags: 列表记录语句queryinsertmtimerows2forloop
3条回答

以下语法适用于SQLServer2008,但不适用于SQLServer2005。在

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     

我不太清楚你的想法,但这是你需要的吗?在

伪代码

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, )  

一个INSERT语句总是对应于表中的一个新行。(除非在插入过程中出现错误。)您可以插入一行,然后在以后更新该行以添加/更改信息,但不存在拆分插入的操作。在

如果您有一个查询需要在不断变化的数据中执行多次,最好的选择是prepared statement。准备好的语句“编译”SQL查询,但保留每次执行时可以设置的占位符。这提高了性能,因为不需要每次解析语句。您没有指定用于连接postgres的库,所以我不知道语法是什么,但它是可以查找的。在

如果您不能/不想使用准备好的语句,那么您只需为每个insert创建一次查询字符串。不要替换循环之前的值,等到知道所有值后再创建查询。在

相关问题 更多 >