SQL Verschachtelte keys

mercsen

Lt. Commander
Registriert
Apr. 2010
Beiträge
1.681
EIn herzallerliebstes Moin moin!

ich habe mal wieder ein Problem mit MySql, bzw. Datenbanken allgemein.

ich habe, grob und arg gekürzt, folgende Table 'Mitarbeiter':

Code:
ID   |    Niederlassung     | Personalnummer
-----+----------------------+------------------
 1   |             1        |       1
-----+----------------------+------------------
 2   |             1        |       2
-----+----------------------+------------------
 3   |             2        |       1
-----+----------------------+------------------
 4   |             1        |       3
-----+----------------------+------------------
 5   |             2        |       3

als primary Key dient mit hier die ID.
Ich will jetzt erreichen, das eine Personalnummer in jeder Niederlassung nur einmal vorkommen darf.

Ich habe dann als erstes versucht Niederlassung und Personalnummer ebenfalls als key zu nutzen, die ID der Mitarbeiter ermöglicht es aber trotzdem doppelte Personalnummern einzutragen.
Personalnummer UNIQUE zu machen hat nicht den gewünschten Effekt, denn dann wird außer acht gelassen das pro Niederlassung ja doppelte Personalnummern auftreten können.

Bisher habe ich mein Programm die Personalnummern verwalten lassen, das ist mir aber ehrlich gesagt zu unsicher, da ich dann immer selber den Check durchführen muss.

meine einzige Lösung wäre jetzt ein Trigger zu schreiben der die Personalnummern prüft, doch bevor ich das mache würde ich gerne wissen ob so etwas auch mit Haus mitteln erreicht werden kann.

Und falls ich einen Trigger nutzen muss, kann ich damit dann einen Fehler erzeugen, der meinem PHP Script mitteilt das der Update / Insert versuch fehlgeschlagen ist und ursprüngliche Aktion abbrechen?

P.S.
da ein Mitarbeiter auch nur einmal pro Niederlassung auftreten darf, gibt es keine Extra Relation die Mitarbeiter und Niederlassungen verknüpft.
 
(select max(Personalnummer) from ... where niederlassung = 1) +1?

wenn DU das ergebnis gleich in einen Schreibvorgang packst und es als eine Tranksaktion durchführst, sollte es auch gleichzeitige Zugriffe abkönnen
 
wenn identität aus erfassungssiht, dann id-spalte raus und pk über spalte niederlassung und personalnummer. ansonsten select distinct niederlassung, personalnummer
 
Code:
ALTER TABLE xyz ADD UNIQUE KEY (Niederlassung, Personalnummer)

Die Kombination aus Niederlassung und Personalnummer muss eindeutig sein!
 
äh ja danke soweit, auf diese ideen bin ich auch schon gekommen, aber mir geht es darum das MySql den query abweist oder einen Fehlererzeugt, sollte ein Query dochmal versuchen eine schon vorhandene personalnummer noch einmal einzutragen. Ich will die verantwortung also an die DB abgeben, sodass ich nur prüfen muss ob der query erfolgreich war. Sollte ein Konflikt entdeckt werden, soll der Query also abgewiesen werden, ohne das ich im Programm vorher gucken muss ob die Personalnummer schon vergeben wurde.
 
Ein Mitarbeiter dürfte über seine Personalnummer eh eindeutig identifizierbar sein, daher scheint mir die Spalte ID auch überflüssig. Somit sind Personalnummer und Niederlassung der Schlüssel und gut ist.
 
Was genau möchtest du nun erreichen? Willst du, dass die Datenbank es nicht zulässt, doppelte Mitarbeiter pro Abteilung hinzuzufügen? Dann machst du einen mehrspaltigen Index.

Dann musst du dir nur noch überlegen, ob und wie du vor einem Insert prüfst, ob du den Datensatz anlegen darfst.

Edith sagt noch: Natürlich gibt es je nach SQL Provider ne Exception bei nem duplicate Index oder es kommen 0 rows affected zurück.
 
ja er ist in seiner niederlassung über die Personalnummer eindeutig identifizierbar. Global aber nur über seine ID.
das hat damit zu tun das einige User nur auf einer Niederlassung, andere über alle Niederlassungen arbeiten können, deshalb ich ich die ID genommen, denn die Personalnummer ist leider recht willkürlich .....

Aber ice-breaker hats mal wieder gerissen, geht doch nichts über die gute alte Konsole und befehle selber eintippen, man verweichlicht total mit diesen ganzen Grafischen Oberflächen ^^

Danke soweit, problem gelöst
 
Mercsen schrieb:
Aber ice-breaker hats mal wieder gerissen, geht doch nichts über die gute alte Konsole und befehle selber eintippen, man verweichlicht total mit diesen ganzen Grafischen Oberflächen ^^

Über die GUI-Tools kann man leider immer nur einen Bruchteil von dem machen, was mit SQL-Querys geht ;) Da führt dann meist kein Weg daran vorbei in irgendeiner Form (Konsole, PHPMyAdmin, MySQL Query Browser) selbst SQL-Statements zu formulieren.
 
Zurück
Oben