【发布时间】:2012-08-07 20:09:28
【问题描述】:
我正在使用 Oracle 11.2g 实例。 我想通过自己生成主键值将行插入表中来了解我所暴露的内容。 我会从某些表中选择 max(pk); 然后将接下来的一百个值用于我接下来的 100 个插入。 是在玩火吗?
上下文是:我有大量的插入要做,这些插入被分成几个由外键链接的表。我试图获得良好的性能,而不是使用 PL/SQL。
[编辑] 这里是一个看起来像我正在处理的代码示例:
QString query1 = "INSERT INTO table 1 (pk1_id, val) VALUES (pk1_seq.nextval, ?)"
sqlQuery->prepare(query);
sqlQuery->addBindValue(vec_of_values);
sqlQuery->execBatch();
QString query2 = "INSERT INTO table 2 (pk2_id, another_val, pk1_pk1_id) VALUES (pk2_seq.nextval, ?, ?)"
sqlQuery->prepare(query);
sqlQuery->addBindValue(vec_of_values);
// How do I get the primary keys (hundreds of them)
// from the first insert??
sqlQuery->addBindValue(vec_of_pk1);
sqlQuery->execBatch();
【问题讨论】:
-
如果你只从一个会话中插入,这不是玩火,但它很多慢。创建一个具有大缓存的序列并使用它。
-
使用
max(pk)不会扩展,会很慢,最糟糕的是:如果不止一个会话这样做,如果这样做就不正确。 Tom Kyte 关于创建自己的 PK 值的主题说:“您可以使其正确,或快速或可扩展”(这意味着你只能实现其中一个目标,而不是三个目标) -
如果第一个 INSERT 只创建一行,为什么会有“数百个 PK”?
-
它不是在创建单行......一次调用数百行。
-
那我不明白你使用的那种语言...我只看到一个 INSERT
标签: sql