INDEX und UNIQUE KEY um Feld Kombis zu verhindern
AhANiBoy
- datenbank
hi
In der User-Tabelle werden die Werte "first", "last", "city" und "country" erfasst.
Es DÜRFEN gleiche Vornamen und gleiche Nachname vorkommen,
aber NIEMALS darf die KOMBINATION aus Vorname und Nachname ein weiteres Mal vorkommen.
Rudolf Bauer [OK]
Rudolf Meier [OK]
Dominik Bauer [OK]
Dominik Meier [OK]
Rudolf Bauer [NICHT OK !]
(Genau diese Vorname-Nachname Kombi existiert bereits)
Gelöst habe ich das so:
CREATE TABLE mytest
(
id
INT( 10 ) NOT NULL AUTO_INCREMENT ,
first
VARCHAR( 250 ) NOT NULL ,
last
VARCHAR( 250 ) NOT NULL ,
city
VARCHAR( 250 ) NOT NULL ,
country
VARCHAR( 250 ) NOT NULL ,
PRIMARY KEY ( id
),
UNIQUE KEY mykey
(first
,last
)
);
Die Fragen zu der Problematik lauten:
a) Ist der CREATE TABLE-Syntax [OK] so wie ich den schrieb, oder sind Fehler darin?
b) Was ist der Unterschied zwischen
UNIQUE (first
,last
)
UNIQUE KEY mykey
(first
,last
)
Erfüllt eines der beiden vielleicht nicht ganz seinen Zweck wie ich es haben möchte?
Sollte ich für meine Weiteren Versuche nur eines der beiden verwenden oder soll ich sie mischen?
Ist eines von den beiden falsch?
c) Die Regel dass sich die Vorname-Nachname Kombi nicht wiederholen dürfen existiert bereits.
Nun soll eine WEITERE (ZUSÄTZLICHE) Regel hinzukommen,
dass User aus der gleichen Stadt einmalig (UNIQUE) sein müssen.
Neumarkt Österreich [OK]
Neumarkt Deutschland [OK]
München Deutschland [OK]
Neumarkt Österreich [NICHT OK !!] (Diese Kombi gibt es schon!)
Wie muss ich das definieren im CREATE TABLE Syntax?
Ein UNIQUE KEY besteht bereits (first, last),
also vermute ich, dass ein weiterer (für city, country) nicht erlaubt ist.
d) Noch ein weiterer würde auch für die ID noch hinzukommen.
ID wird möglicherweise auch nicht auto_increment.
Wie geht das dann?
Man sagt bei auto_increment Feldern darf kein UNIQUE KEY wert mehr draufgelegt werden.
Schönen Tag noch wünscht
Euer AhANiBoy
hi
Nun hätt` ich fast das Wichtigste vergessen!
Meine Frage handelt sich um MySQL!
Schönen Tag noch wünscht
Euer AhANiBoy
Hello,
Gelöst habe ich das so:
CREATE TABLE
mytest
(
id
INT( 10 ) NOT NULL AUTO_INCREMENT ,
first
VARCHAR( 250 ) NOT NULL ,
last
VARCHAR( 250 ) NOT NULL ,
city
VARCHAR( 250 ) NOT NULL ,
country
VARCHAR( 250 ) NOT NULL ,
PRIMARY KEY (id
),
UNIQUE KEYmykey
(first
,last
)
);
Man lernt bekanntlich am meisten, wenn man die Fragen von anderen beantworet. Ich will es also acuh mal veruchen ;-)
Das sieht schon sehr gut aus. Nur würde ich nicht soviel Platz verschwenden.
MWn wird der Index über die Felder in der vollen Breite angelegt, während die Felder selber nur soviel Platz verbrauchen, wie MicroExtents für den Inhalt nötig sind.
Überlege, ob Du wirklich 250 Zeichen haben musst, oder ob die üblichen 35 nicht ausreichen.
b) Was ist der Unterschied zwischen
UNIQUE (
first
,last
)
UNIQUE KEYmykey
(first
,last
)
Das Schlüsselwort KEY oder INDEX (Synonyme) ist optional. Wenn der Index nicht UNIQUE sein soll, natürlich nicht, dann braucht man eins von beiden. Die Namensvereinbarung für den KEY ist auch optional. Allerdings kann man nur bei vergebenem Namen die "ORDER BY keyname
" Klausel benutzen.
Da es kaum Ressourcen kostet, würde ich immer einen sinnvollen Nanmen vergeben, der auch für Außenstehende plausibel ist. Man kann die Keynames nämlich abfragen und dann zu einer Selectbox zusammenfassen, die man dem User bereitstellt.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
yo,
aber NIEMALS darf die KOMBINATION aus Vorname und Nachname ein weiteres Mal vorkommen.
da will ich noch mal nachhaken. was spricht den gegen zwei datensätze in deiner tabelle, die den gleichen vornamen, nachnamen haben, wie zum bespiel Peter Müller ? ich frage deswegen, weil in unseren schönen welt gleiche namen nicht ausgeschlossen sind, zumal du auch einen künstlichen PK angelegt hast.
id
INT( 10 ) NOT NULL AUTO_INCREMENT ,
das not null ist hier überflüssig, da du es später zu einem PK deklarierst, welche per definition immer zwei gegenschaften besitzen, not null und unique.
b) Was ist der Unterschied zwischen
UNIQUE (
first
,last
)
UNIQUE KEYmykey
(first
,last
)
ich würde sagen, im zweiten falle hat das kind einen selbstgewählten namen "mykey", wobei der name in meinen augen nicht sinnvoll gewählt wurde.
Nun soll eine WEITERE (ZUSÄTZLICHE) Regel hinzukommen,
dass User aus der gleichen Stadt einmalig (UNIQUE) sein müssen.Neumarkt Österreich [OK]
Neumarkt Deutschland [OK]
München Deutschland [OK]
Neumarkt Österreich [NICHT OK !!] (Diese Kombi gibt es schon!)
auch hier gilt das gleiche wie bei den namen, warum kann es den nicht ein "kleinniederdorf" in deutschland und in österreich geben ?
d) Noch ein weiterer würde auch für die ID noch hinzukommen.
ID wird möglicherweise auch nicht auto_increment.
Wie geht das dann?
nun, dan muss du eben die ensprechende syntax des auto-incemrent weglassen. wenn nun neue datensätze hinzugefügt werden sollen, dann muss das feld ID einen wert bekommen und kan nicht wie bei auto-inccrement leer gelassen werden.
Ilja