Wie kann ich das verhindern?
Ich bin mir nicht sicher, wie dein Datenbankdesign allgemein aussieht, vielleicht ließe sich das durch Design-Anpassungen vermeiden.
Falls nicht, würde ich hier eher auf die Anwendungsebene wechseln.
Statt die ID's so einzutragen, wie sie rein kommen, sollte deine Anwendung eine "Normalisierung" durchführen.
Simpler Algorithmus:
[src=python]# normalizes
def normalize(ids):
io_ids = ids.copy()
io_ids.sort()
return io_ids
# incoming id's in what ever order
ids_ooo = [3, 2]
ids_io = normalize(ids_ooo)
# work with the ids
print(ids_io)[/src]
Funktionsweise: Du steckst die IDs in beliebiger Reihenfolge rein und bekommst sie "normalisiert" heraus.
Dazu legen wir zunächst eine Kopie der ursprünglichen Liste an. Ob das nötig ist oder du auf der originalen Liste arbeiten kannst, hängt von deinem konkreten Einsatzzweck ab. Die IDs werden in aufsteigender Reihenfolge zurück gegeben.
Grundlegende Idee:
Wenn du zwei IDs normalisierst, (besser gesagt deren Reihenfolge) landet folglich immer die kleinere ID an Position 1 und die größere an Position 2.
Wenn du nun also ganz allgemein zwei Tupel von IDs hast, so dass: (x, y), (y, x)
dann ist die Repräsentation innerhalb der Datenbank für beide Tupel identisch und in der Datenbank würde durch deine Anforderung der Eindeutigkeit kein doppelter Eintrag entstehen..
Nachtrag:
Wenn nicht klar ist, ob deine Anwendung sich stets an die Konvention hält, dann kannst du natürlich auch deine Datenbank diese Anforderung erfüllen lassen:
INSERT:
[src=mysql]VALUES (LEAST(15, 10), GREATEST(10, 15))[/src]
SELECT:
[src=mysql]WHERE `first` = LEAST(2, 1) AND `second` = GREATEST(1, 2)[/src]
Wenn die Queries aus einer Anwendung kommen, kannst du das auch mit Views und Triggern(?!) entsprechend "verstecken".