2016-05-18 9 views
0

Ich habe folgendes Postgres Tabellehinzufügen Einschränkung Postgres Tabelle basierend auf dem Wert

column_a | column_b | 
---------+-----------+ 
001  | 1   | 
004  | 2   | 
006  | 3   | 
007  | 4   | 
008  | 5   | 
104  | 0   | 
204  | 0   | 

Ich möchte eine Einschränkung dieser Tabelle hinzuzufügen, so dass, wenn (RIGHT(column_a, 1) = '4' OR column_a = '006') AND column_a <> '004' der Wert column_b Bedürfnisse auf 0 gleich sein Wenn das nicht der Fall, ich möchte einen Fehler werfen.

Wie kann ich das tun?

Danke!

+0

So '006 | 3' ist ein Fehler? –

+0

Sie sollten Ihre Einschränkung erklären. Weil Ihr OR UND widersprüchlich sind –

+0

Ja '006 | 3' ist ein Fehler. Grundsätzlich möchte ich alle Werte von 'column_b' auf 0 setzen, wenn die rechte Ziffer von' column_a' auf 0 steht. Die Ausnahmen sind, wenn 'column_a = '004'' ist, dann muss' column_b 'nicht sein 'ist 0. Auch wenn' column_a = '006'' dann brauche ich 0 – Vincent

Antwort

1

Sie haben ziemlich genau die Antwort schon, Sie müssen nur Ihre Logik zu einem Ausdruck neu anordnen, die Sie in eine CHECK-Einschränkung werfen können.

Sie haben eine Aussage des Formulars P -> Q wo -> logische Implikation ist. Aber aus elementaren Logik wissen wir, dass:

(P -> Q) <-> (-P | Q) 

dass Zutreffen auf Ihre Implikation und übersetzen zu SQL bekommen wir den SQL-Ausdruck:

NOT ((RIGHT(column_a, 1) = '4' OR column_a = '006') AND column_a <> '004') OR (column_b = 0) 

Dann ist es einpacken in einem CHECK:

alter table your_table 
add constraint whatever_you_want_to_call_it 
check (
    not ((right(column_a, 1) = '4' or column_a = '006') and column_a <> '004') 
    or (column_b = 0) 
) 

Sie könnten De Morgans Gesetze verwenden, um den not innerhalb des ersten geklammerten Ausdrucks zu verschieben, wenn Sie wollten, oder Sie konnten es draußen lassen, um die -P | Q p hervorzuheben attern, damit die Menschen (vielleicht, hoffentlich, ...) die verkleidete Implikation erkennen.

Verwandte Themen