我有一个程序将一堆数据插入SQL数据库。数据由 Reports 组成,每个 Reports 都有标签。
标记有一个字段 report_id ,它是对相关报告的主键的引用。
现在,每次插入数据时,都可以有200个 Reports 甚至更多,每个可能有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
声明。
INSERT report...
能够返回插入的主键,这可能吗?由于我目前必须在报告之间提交,因此程序会在这些时刻“暂停”。如果我可以在最后提交所有内容,那么它将大大减少花费的时间。我一直在考虑在用于识别的报告中创建一个单独的字段,这样我就可以report_id = (SELECT id FROM reports WHERE seperate_field=?)
或标签中的某些内容,但这似乎并不优雅。
答案 0 :(得分:1)
这不意味着如果另一个进程在适当的时刻插入数据,那么[" SELECT @@ IDENTITY"]语句会返回错误的主键吗?
没有。数据库引擎跟踪为每个连接插入的最后一个标识值,并返回执行SELECT @@IDENTITY
语句的连接的相应值。