SQL optimiert, so dass die Where-Klausel zuerst geprüft werden und ein Resultset bildet.
In diesem Resultset sind deine neu eingefügten Sätze natürlich nicht enthalten und werden somit nicht geprüft.
Wenn die neuen Sätze dann zu einem doppelten Schlüssel führen bekommst du halt den Fehler.

Ggf. musst du statt "not in" einen "select ... from datei exception join lateral (select ... from datei where ...)" machen.
Der Lateral kann nicht optimiert werden und grift immer neu auf die Tabelle zu, so dass neu hinzugefügte Zeilen dann berücksichtigt werden.

"exception join" entspricht einen "not exists" nur als Join-Beziehung statt where.