Ich möchte den gesamten Inhalt einer Tabelle ersetzen, ohne dabei eingehende SELECTAnweisungen zu beeinflussen .
Der Anwendungsfall ist eine Tabelle, in der Postfachinformationen gespeichert werden, die regelmäßig extrahiert werden, und die in einer PostgreSQL-Tabelle gespeichert werden muss. Es gibt viele Clients, die eine Anwendung verwenden, die ständig dieselbe Tabelle abfragt.
Normalerweise würde ich sowas machen (Pseudocode eingehend) ...
BEGIN TRANSACTION
TRUNCATE TABLE
INSERT INTO
COMMIT
Leider kann die Tabelle während dieses Vorgangs nicht gelesen werden. Aufgrund der Zeit, die INSERT INTOfür die Fertigstellung benötigt wird. Der Tisch ist gesperrt.
In MySQL hätte ich ihren atomaren RENAME TABLEBefehl verwendet, um diese Probleme zu vermeiden ...
CREATE TABLE table_new LIKE table;
INSERT INTO table_new;
RENAME TABLE table TO table_old, table_new TO table; *atomic operation*
DROP TABLE table_old;
Wie könnte ich das in PostgreSQL erreichen?
In dieser Frage können Sie davon ausgehen, dass ich keine Fremdschlüssel verwende.
TRUNCATEBefehl erhält eine AccessExclusive-Sperre für die Tabelle, sodass niemand sonst in der Lage ist, aus der Tabelle zu lesen, bis diese Transaktion festgeschrieben oder zurückgesetzt wird.
deletestattdessen verwenden truncate, wird es langsamer, aber ohne die Leser zu blockieren. Wie viele Zeilen müssen Sie löschen?
DELETEund INSERTwäre viel zu lang.