2017-06-27 22 views
0

我有一个程序在SQL数据库中插入一堆数据。数据由报告组成,每个具有多个标签用pyodbc返回INSERT的主键

标签具有场REPORT_ID,这是相关的报告的主密钥的参考。现在

,每次我插入数据时,可以有200个报告甚至更​​多,每个也许有400个标签。所以在伪代码我现在这样做:

for report in reports: 
    cursor_report = sql('INSERT report...') 
    cursor_report.commit() 
    report_id = sql('SELECT @@IDENTITY') 

    for tag in report: 
     cursor_tag += sql('INSERT tag, report_id=report_id') 
    cursor_tag.commit() 

我不喜欢这个由于几个原因。大多数情况下,我不喜欢SELECT @@IDENTITY声明。

  1. 这不是说如果另一个进程在正确的时刻插入数据,那么语句会返回错误的主键?
  2. 我宁愿INSERT report...返回插入的主键,这是可能的吗?

由于我目前不得不在报告之间提交程序“暂停”在这些时刻。如果我能在最后完成所有事情,那么它将大大减少花费的时间。我一直在考虑在报告创建一个单独的字段用于识别,所以我可以report_id = (SELECT id FROM reports WHERE seperate_field=?)标签中的东西,但看起来不是很优雅。

回答

1

这不是说如果另一个进程在正确的时刻插入数据,那么[“SELECT @@ IDENTITY”]语句会返回错误的主键?

号数据库引擎跟踪每个连接插入的最后一个标识值,并返回其上执行SELECT @@IDENTITY语句的连接合适的值。

+0

噢好吧,我认为它返回了最后一个主键插入任何连接的地方 - 我只有对SQL的中间理解。谢谢你的回答,这至少意味着我的方法应该按我的意愿工作,即使它比我想要的慢一点:) –