2016-12-29 3 views
0

Ich habe 3 Tabellen:PostgreSQL: FOREIGN KEY/ON DELETE CASCADE/TRIGGER

Details

Detail_Archive

Transaction_Results

Transaction_Results ist eine neue Tabelle, die ich nicht gebaut und hat eine Einschränkung, die ich wahrscheinlich vollständig entfernen könnte, aber ich würde glauben, dass es einige Funktionen brechen könnte, von denen ich annehme, dass es dafür gebaut wurde.

ALTER TABLE Transaction_Results 
ADD Constraint Transaction_Results_Detail_DetailID_fkey FOREIGN KEY (DetailID) 
REFERENCES Details (DetailID) MATCH SIMPLE 
ON UPDATE NO ACTION ON DELETE NO ACTION 

Jetzt in der Vergangenheit habe ich einfach kopiert und gelöschte Datensätze aus Detail- und in Detail_Archive

Was wären die häufigste Art und Weise (n) die Einschränkung zu halten? Meine Idee wäre: vielleicht mache ich null-fähig und setze die Werte, die ich entferne, auf null, verschiebe sie vielleicht in eine zusätzliche Spalte, die auf die Archivversion der Tabelle verweist, und mache diese ebenfalls null-fähig. In meinem Code, wo ich das brauchte, werde ich mich mit diesem Problem beschäftigen müssen, aber das ist nicht so schlecht für mich.

+0

Es ist ein FOREIGN KEY, es stellt sicher, dass für jeden Wert der DetailID in dieser Tabelle ein Datensatz in der Detailtabelle mit dem gleichen Wert von DetailID vorhanden ist. [wiki FK] (https://en.wikipedia.org/wiki/Foreign_key) – McNets

+0

Ja ... Das ist mein Problem .... –

+0

Nun, die offensichtliche (und wahrscheinlich falsche) Antwort wäre, Zeilen zu löschen von " Detail "oder" Details ". Das scheint "Transaction_Results" zu sein. Die einfachste Lösung wäre, entweder die Abhängigkeit zu löschen oder sie auf "Delete cascade" zu setzen. Sie müssen wissen, wie Zeilen in "Transaction_Results" enden oder wie Sie den Designer finden, um zu wissen, welches Programm geeignet ist. –

Antwort

0

Also nahm ich den Brute-Force-Ansatz.

ALTER TABLE Transaction_Results DROP CONSTRAINT Transaction_Results_Detail_DetailID_fkey ; 
ALTER TABLE Transaction_Results ALTER COLUMN DetailID DROP NOT NULL; 

ALTER TABLE Transaction_Results ADD COLUMN DetailID_Archive integer NULL; 

CREATE OR REPLACE FUNCTION process_Detail_delete() RETURNS TRIGGER AS $Transaction_Results_trigger$ 
    BEGIN 
     -- 
     -- Update a row in Transaction_Results to reflect the delete performed on Detail, 
     -- make use of the special variable TG_OP to work out the operation. 
     -- 
     IF (TG_OP = 'DELETE') THEN 
      UPDATE Transaction_Results SET DetailID = NULL, DetailID_Archive = OLD.DetailID where DetailID = OLD.DetailID ; 
      RETURN OLD; 

     END IF; 
     RETURN NULL; -- result is ignored since this is an AFTER trigger 
    END; 
$Transaction_Results_trigger$ LANGUAGE plpgsql; 

CREATE TRIGGER Transaction_Results_trigger 
AFTER DELETE ON [Detail] 
    FOR EACH ROW EXECUTE PROCEDURE process_Detail_delete();​ 
Verwandte Themen