Bedingter PostgreSQL-Fremdschlüssel

8

Ist es in PostgreSQL möglich, einen Fremdschlüssel bedingt hinzuzufügen?

Etwas wie: ALTER TABLE table1 ADD FOREIGN KEY (some_id) REFERENCES other_table WHERE some_id NOT IN (0,-1) AND some_id IS NOT NULL;

Insbesondere hat meine Referenztabelle alle positiven ganzen Zahlen (1+), aber die Tabelle, zu der ich den Fremdschlüssel hinzufügen muss, kann stattdessen null (0), null und eine negative Zahl (-1) enthalten, die alle etwas anderes bedeuten / p>

Anmerkungen:

  

Ich bin mir bewusst, dass dies ein schlechtes Tabellendesign ist , aber es war ein cleverer Trick, der vor mehr als 10 Jahren entwickelt wurde, als die Funktionen und Ressourcen, die wir zu diesem Zeitpunkt zur Verfügung hatten, nicht existierten. Dieses System betreibt Hunderte von Einzelhandelsgeschäften, so dass die Umstellung der Methode zu diesem Zeitpunkt Monate dauern kann, die wir nicht haben.

     

Ich kann keinen Trigger verwenden, MUSS mit einem Fremdschlüssel gemacht werden.

    
trex005 05.06.2012, 16:00
quelle

5 Antworten

1

Sie können eine weitere "Schatten" -Spalte zu table1 hinzufügen, die die gereinigten Werte enthält (d. h. alles außer 0 und -1 ). Verwenden Sie diese Spalte für die referenziellen Integritätsprüfungen. Diese Schattenspalte wird durch einen einfachen Trigger für table1 aktualisiert / gefüllt, der alle Werte außer 0 und -1 in die Schattenspalte schreibt. Sowohl 0 als auch -1 könnten auf null abgebildet werden.

Dann haben Sie Referenzintegrität und Ihre unveränderte ursprüngliche Spalte. Der Nachteil: Sie haben auch einen kleinen Trigger und einige redundante Daten. Aber leider ist dies das Schicksal eines Legacy-Schemas!

    
A.H. 05.06.2012, 17:42
quelle
2

Die kurze Antwort ist nein, Postgres hat keine bedingten Fremdschlüssel. Einige Optionen, die Sie in Betracht ziehen könnten, sind:

  1. Habe einfach keine FK-Beschränkung. Verschieben Sie diese Logik in die Datenzugriffsebene und leben Sie ohne referentielle Integrität.
  2. Erlaube NULL in der Spalte, was auch bei einer FK-Bedingung perfekt ist. Verwenden Sie dann eine andere Spalte, um die Bedeutung von 0 und -1 zu speichern.
  3. Fügen Sie eine Dummy-Zeile in der referenzierten Tabelle für 0 und -1 hinzu. Selbst wenn es nur falsche Daten hätte, würde es die FK-Beschränkung erfüllen.

Hoffe, das hilft!

    
Mike Christensen 05.06.2012 16:07
quelle
1

Ihre Anforderung entspricht dieser Prüfbedingung:

%Vor%     
Clodoaldo Neto 05.06.2012 16:33
quelle
0

Hier ist eine andere Möglichkeit. Verwenden Sie die PG-Vererbung, um eine Partition der Tabelle zu erzwingen, die +1 in der Flag-Spalte hat und ansonsten. (Übliche Regeln / Auslöser, um dies aufrechtzuerhalten.) Dann haben Sie die FK-Beziehung zwischen nur der untergeordneten Has_PLUS_ONE-Tabelle und der referenzierten Tabelle.

    
Andrew Lazarus 08.06.2012 21:56
quelle
0

Sie können dies mit einer Prüfbedingung und einem Fremdschlüssel implementieren.

%Vor%

(nicht getestet)

    
Jeremy Salwen 18.04.2017 00:41
quelle

Tags und Links