2016-04-20 5 views
2

Ich habe eine Tabelle, die zwei Felder hat. Die Struktur ist wie folgt:Wie können Sie die Fremdschlüssel- und Primärschlüsseleinschränkungen in PostgreSQL vorübergehend deaktivieren?

CREATE TABLE raw_links 
(
    value_id bigint NOT NULL, 
    raw_id integer NOT NULL, 
    CONSTRAINT raw_links_pk PRIMARY KEY (raw_id, dp_id), 
    CONSTRAINT raw_fk FOREIGN KEY (raw_id) 
     REFERENCES raw_data (raw_data_id) MATCH SIMPLE 
     ON UPDATE RESTRICT ON DELETE RESTRICT 
) 

Ich habe 5 Millionen Datensätze aus dieser Tabelle zu löschen. Dafür möchte ich beide Einschränkungen deaktivieren, damit das Löschen schneller wird. Nach dem Löschen möchte ich beide Einschränkungen erstellen.

+0

Sie müssen sie löschen und neu erstellen. –

+0

Ok, ich werde dann fallen, ich werde meine 50 Lakhs Datensätze löschen. Nach, wenn ich neu erstellen wird dann wird es Ausnahme werfen ??? Da gibt es eine Chance der Mismatch der Datensätze zwischen dieser Tabelle und raw_data Tabelle .. – SUDARSHAN

Antwort

1

Sie können ALTER TABLE DROP CONSTRAINT raw_links_pk und das gleiche für raw_fk tun.

Nachdem Sie die Datensätze gelöscht haben, führen Sie zuerst eine VACUUM ANALYZE raw_links (oder VACUUM FULL raw_links, wenn Sie Speicherplatz freigeben möchten), um die Tabellenstatistiken zu aktualisieren.

Dann schließlich die Einschränkungen mit ALTER TABLE ADD CONSTRAINT ... neu erstellen.

+0

Ok ich werde dann fallen Ich werde meine 50 Lakhs Datensätze löschen. Nach, wenn ich neu erstellen werde dann wird es Ausnahme werfen ??? Da gibt es eine Chance der Übereinstimmung der Datensätze zwischen dieser Tabelle und Raw_Data Tabelle .. – SUDARSHAN

+0

Das kann nur passieren, wenn es Updates auf 'Raw_Data gibt .raw_data_id', während Sie dies tun. In diesem Fall können Sie die Abhängigkeiten nicht löschen und sollten dies nur langsam tun, wenn die Abhängigkeiten vorhanden sind. – Patrick

Verwandte Themen