私は同僚の SQL の問題を手伝っていました。主に、すべての行をテーブル A からテーブル B (両方のテーブルが同じ列 (名前と型) を持つ) に移動したいと考えていました。これは Oracle 11g で行われましたが、あまり重要ではないと思います。
彼らの最初の素朴な実装は次のようなものでした
BEGIN
INSERT INTO B SELECT * FROM A
DELETE FROM A
COMMIT;
END
彼らの懸念は、AからBへのコピー中にテーブルAにINSERTが行われ、「DELETE FROM A」(または価値がある場合はTRUNCATE)によってデータが失われる(Aに新しく挿入された行が削除される)ことでした。
もちろん、コピーした行の ID を一時テーブルに格納してから、一時テーブルの IDS に一致する A の行だけを削除することをすぐに推奨しました。
ただし、好奇心のために、INSERT と DELETE の間に待機コマンド (PL/SQL 構文を覚えていないでください) を追加して、ちょっとしたテストを行いました。次に、別の接続からDURING THE WAITに行を挿入します。
そうすることで、それがデータの損失であることがわかりました。SQL Server でコンテキスト全体を再現し、すべてをトランザクションにラップしましたが、それでも SQL Server で新しいデータが失われました。これにより、最初のアプローチに体系的なエラー/欠陥があると思いました。
ただし、TRANSACTION が新しい INSERT から (どういうわけか?) 分離されていなかったという事実なのか、それとも WAIT コマンド中に INSERT が発生したという事実なのかはわかりません。
結局、私が提案した一時テーブルを使用して実装しましたが、「なぜデータが失われたのか」という答えを得ることができませんでした。なぜなのかご存知ですか?