[Frage] Ein Wert darf nur einmal in mehreren Spalten vorkommen.

Kampfgummibaerlie

Datenbank-Guru
Beiträge
743
Annahme, ich würde eine Datenbank aufbauen wollen, in welcher eine ganze Familie, jedoch jeweils nur 1 Person pro Familie "auf dem Spielfeld" stellen kann.

Ist das irgendwie mittels einem simplen Constraint möglich? (Vl. weiß ich es noch nicht, oder habe es bisher vergessen, weil ja doch auch andere Dinge auf der Welt wandeln :))

Mein Einfall wäre, eben wie bei dem Feiertage nicht eintragbar machen, über jede Menge Constraints zu machen.

Sprich:
Code:
create table family(id serial primary key, name text unique)
Tabelle family erstellen

Code:
create table familymembers(id serial primary key, familyname text references family(name), member text unique);
Tabelle familymembers erstellen

Code:
create table spielfelder(id serial, spielfeldname text, spieler_1 text references familymembers(member), spieler_2 text references familymembers(member), spieler_3 text references familymembers(member), spieler_4 text references familymembers(member));
Tabelle Spielfelder erstellen

Die (mir) eingefallene Lösung wäre es einfach mittels 3 ungleich Constraints zu machen, ala:
1.:
Code:
create function member_of_family(x text) returns text as 'select familyname from familymembers where member = x' language sql;

2.:
Code:
alter table spielfelder add constraint just_one_per_family check (member_of_family(spieler_1) != member_of_family(spieler_2) AND member_of_family(spieler_1) != member_of_family(spieler_3) AND member_of_family(spieler_1) != member_of_family(spieler_4));

Insertcodes:
Code:
insert into family(name) values ('Rauchfangkehrer');

Code:
insert into familymembers(familyname, member) values ('Rauchfangkehrer', 'Raffael');

Testcode:
Code:
insert into spielfelder(spieler_1, spieler_2) values ('Raffael', 'Raffael');

Also, auf diesen Weg funktioniert es nicht, was ich auch erreichen wollte, aber ich frage nach, ob PostgreSQL eine Möglichkeit hat, direkt mehrere Spalten voneinander ungleich zu erfordern.

Ja, ich weiß, langer Thread, aber ich denke, ich bin langsam in meinem Element :)
Werde im November einen Anfänger-Kurs zwecks Homepages machen (HTML und CSS), und hoffentlich auch wieder ins Berufsleben einsteigen ;D

Ich bedanke mich hier in der Öffentlichkeit, dass der liebe Mr. Elephant (Akretschmer :D) das Leben eines jungen Pensionisten "gerettet" hat ;)

EDIT: Kleiner Denkfehler beim erstellen, lasse ihn aber drinnen, falls wer anders den gleichen Gedankenweg hat, wie ich ;)
Es sind die entsprechenden 3 "Constraints" in einem eingebaut.

EDIT2: Würde das Ganze gerne in PostgreSQL 9.4 lösen, weil ich nicht weiß, ob und wie ich den NAS auf das 10er upgraden könnte ;D
 
Zuletzt bearbeitet:
Werbung:
warum ist der foreign key in familymembers nicht auf den PK der Zieltabelle? Das ist - ungewöhnlich.

Zu Deiner Frage: fällt mir spontan keine Antwort ein außer auch einen FK auf die Familie mit zu speichern und einen Check-Constraint zu definieren, der prüft, daß es keine mehrfachen Werte da gibt. Aber wenn da nur ein FK auf die Person und erst in dieser Tabelle ein FK auf die Familie ist fällt mir keine funktionierende Lösung ein.
 
Werbung:
Ok, ich habe nur schnell irgendwas geschrieben, habe nicht nachgedacht, wie es im Endeffekt aussehen sollte, sondern, wie die Codes funktionstüchtig sind ;)

Aber ja, danke, sprich ich suche nicht länger danach, sondern schreibe etc. lange Constraints in das Ganze.

Würde es einsetzen wollen (Spaßhalber) für eine World of Warcraft Datenbank, wo bis zu 40 Teilnehmer daran teilnehmen können, glaube ich (wenn dem noch so ist), in den einzelnen Instanzen, und damit sich niemand aus versehen 2 mal anmeldet, oder irgendwas ähnliches in diese Richtung.

Bin heute irgendwie besser drauf, als ansonsten, sollte das Ganze aber irgendwie mehr auf einen Zweig bringen, und sich meine offenbar stark vorhandenen Schwankungen auf ein Niveau ausgleichen.

Würde dir denn eine Lösung einfallen, die mit dem Primary Key in der Zieltabelle ist, einfallen?
Finde, dass es nicht gut aussehen muss, nur entsprechend möglichst einfach und funktionstüchtig sein sollte.
 
Zurück
Oben