Ich möchte einer sehr großen Tabelle eine Prüfbedingung hinzufügen. Etwas wie:
ALTER TABLE "accounts" ADD CONSTRAINT "positive_balance" CHECK ("balance" >= 0);
Leider blockiert PostgreSQL 9.3 Lese- oder Schreibvorgänge, bis die Einschränkungsprüfung abgeschlossen ist. Ich habe dies überprüft, indem ich eine Transaktion gestartet, die ausgeführt ALTER TABLE
, dann eine zweite Transaktion geöffnet und überprüft habe, ob ich bis zum Abschluss der ersten Transaktion nicht aus der Tabelle lesen oder schreiben konnte.
Kann ich diese CHECK
Einschränkung auf irgendeine Weise hinzufügen , ohne die Tabelle zu sperren?
postgresql
constraint
data-integrity
Kevin Burke
quelle
quelle
Antworten:
Sie können eine
NOT VALID
CHECK-Einschränkung erstellen , die die Einschränkung in Zukunft erzwingt, jedoch nicht die gesamte Tabelle beim Erstellen auf Validierung überprüft. Zu einem späteren Zeitpunkt können Sie versuchen,VALIDATE
die Einschränkung zu ändern (wenn eine Sperre für die Tabelle in Ordnung ist).Bitte überprüfen Sie die Dokumentation - Zitat unten:
quelle
(Nicht genug Vertreter, um die andere Antwort zu kommentieren)
Aus der Formulierung in der akzeptierten Antwort geht nicht hervor, was "wenn eine Sperre auf dem Tisch in Ordnung ist" bedeutet.
Laut Postgres ALTER TABLE docs :
und aus den Sperrdokumenten
Bedeutung - "Lesen / Schreiben" wird beim Ausführen nicht blockiert
VALIDATE CONSTRAINT
- Sie müssen nicht "warten, bis das Sperren der Tabelle in Ordnung ist".quelle
VALIDATE CONSTRAINT
schnappte sich einACCESS EXCLUSIVE
Schloss. Dies sind jedoch gute Informationen für zukünftige Leser und Versionen. +1 von mir