了解数据库插入

时间:2009-05-11 12:45:44

标签: database

大多数数据库都支持某种形式的“insert into select ...”语句。

insert into a
select value from b;

这是如何实现的?

我的理解:当语句开始执行时出现的那些行有资格被拾取,并且它们被插入到表a中。同时,新值可以插入到表b中,并且由于查询已经开始执行,因此不会“考虑”它们。

我的理解是否接近准确?任何参考文档都非常感谢。

谢谢!

5 个答案:

答案 0 :(得分:1)

由于您没有特别谈论任何引擎,因此可能会发生这种情况。此外,数据库可能只会在当时选择一行。这一切都取决于引擎,以及应用于数据库的锁。

答案 1 :(得分:1)

大多数现代数据库的答案是multiversion concurrency control

基本上每行都有一个从可见瞬间开始的时间戳。然后,select会考虑隔离级别,以查看在当前语句(用于读提交的隔离)之前或当前事务(用于可序列化隔离)之前已提交的事务所添加的行是否应对select可见。

答案 2 :(得分:0)

“可以插入新值”,具体取决于您的隔离级别;例如,如果它是可序列化的,则不会发生。

答案 3 :(得分:0)

我猜有数据库的具体差异,但我可以为大多数人提供一般答案。 执行“insert as select”时,RDBMS将执行SELECT语句。与任何其他SELECT语句一样,结果将存储在内存中的“虚拟表”中​​(每个数据库及其自己的缓存和RAM管理)。然后,INSERT语句变为普通的多行INSERT语句,因为内存中的结果与通过命令行提供的数据完全相同。 在此阶段,如果将任何新行插入“selected”表,则不会影响INSERT语句。 最后,如果SELECT因此产生太多行,或者会引用锁定表,则事情可能会发生变化,因为RDBMS会以不同方式选择值。

答案 4 :(得分:0)