2017-12-18 2 views
2

Angenommen, Postgresql> = 10, gibt es eine Möglichkeit, eine Tabelle zu beschränken, um eindeutige Werte in zwei (oder mehr) Spalten zu haben? Das heißt, ein Wert kann nur in einer der Spalten erscheinen. Ich möchte Trigger so lange wie möglich vermeiden. Für eine einzelne Spalte wäre das trivial.Eindeutig unter zwei Spalten

Lassen Sie uns diese Tabelle haben:

CREATE TABLE foo (
    col1 INTEGER, 
    col2 INTEGER 
); 

So sollte es

1 2 
4 3 
5 7 

sein Während 8 4 unmöglich wäre, weil es 4 3 ohnehin schon ist.

Bisher dachte ich, es möglich EXCLUDE ((ARRAY[col1, col2]) WITH &&) einschränken könnte, aber es scheint nicht unterstützt (noch?):

ERROR: operator &&(anyarray,anyarray) is not a member of operator family "array_ops" 

Diese Anforderung ist auch als leere Innen verbundene Tabelle (on a.col1 = b.col2) erscheinen werden. Ich schätze, ich könnte Trigger verwenden, aber ich möchte sie so lange wie möglich vermeiden.

P. S. Hier ist a related question.

+0

Können Sie erklären, warum Sie es brauchen? Ich denke, dass es die Regel [Nichts als der Schlüssel] (https://en.wikipedia.org/wiki/Third_normal_form# "Nothing_but_the_key") bricht. Oder vielleicht ist es ein [XY Problem] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Adam

+1

Wie verwenden Sie diese beiden Zahlen? Warum können Sie keine Tabelle mit einer einzelnen Integer-Spalte und z. eine 'varchar'-Spalte, die angibt, ob sie als" col1 "oder" col2 "verwendet wird (diese Namen sind nicht wirklich hilfreich). Sie könnten einen einfachen eindeutigen Index verwenden –

+0

@a_horse_with_no_name: 'col1' und' cols2' bedeuten wirklich, dass die Werte gleich wichtig und austauschbar sind. Sie können nicht in einer Spalte sein, da diese Werte Paare bilden sollten. – Igor

Antwort

1

Ich bin ziemlich Benutzer this answer ist ziemlich nah an dem, was Sie erreichen wollen, aber, wie in der Antwort erwähnt. Es gibt keine wahre Weise, dies zu tun, da es nicht allgemein üblich ist. In der Programmierung, wenn so etwas passiert, wäre es besser, ein Datenbank-Refactoring durchzuführen, um eine alternative, idealere Lösung zu finden. Ich hoffe, ich kann Ihnen helfen!

Verwandte Themen