mysql mit duplicate key update

ghostadmin

Grand Admiral Special
Mitglied seit
11.11.2001
Beiträge
25.209
Renomée
190
Standort
Dahoam Studios
Es geht um eine Datenbank für Telefonnummern. Bisher war das so das ich eine Tabelle für alle User hatte und die Nummer war auf unique gesetzt.
Der User nimmt die Eingaben in einer einzelnen HTML Form vor. Neue und vorhandene Einträge sind also nicht getrennt.

Jetzt möchte ich aber zusätzlich für jeden User ein eigenes privates Telefonbuch. Da kann ich ja keine unique auf die Nummer setzen, sonst können 2 User nicht die selbe Nummer eintragen. Zusätzlich würde ich in der Tabelle ein Feld speichern, wem der Eintrag gehört.

Mal angenommen ich habe eine Tabelle:

create TABLE test( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, number VARCHAR(30), name VARCHAR(30), contact VARCHAR(30), street VARCHAR(30), areacode INT, city VARCHAR(30), mobile VARCHAR(30), email VARCHAR(50), fax VARCHAR(30), extension INT);

So nun könnte ich bestehende Einträge ja updaten mit z.B.:

INSERT INTO test (id, number, name, street, areacode, city, extension) VALUES ('$argid', '$_[0]', '$resultoertname', '$resultoertstreet', '$resultoertareacode', '$resultoertcity', '$argext') ON DUPLICATE KEY UPDATE name=VALUES(name),street=VALUES(street),areacode=VALUES(areacode),city=VALUES(city),extension=VALUES(extension) );

Was ist nun wenn die ID nicht bekannt ist weil neuer Eintrag, gibts da nur den Weg on duplicate wegzulassen? Also:

INSERT INTO test (number, name, street, areacode, city) VALUES ('$argid', '$_[0]', '$resultoertname', '$resultoertstreet', '$resultoertareacode', '$resultoertcity');

Oder gibts da ne ganz andere Möglichkeit?
 
Du könntest eine neue Tabelle (mit identischer Struktur) für jeden User anlegen und neue Einträge in beide Tabellen (die für die Gruppe oder die private) eintragen, dabei dem User per Formularoption die Wahl überlassen, wo die Telefonnummer eintragen werden soll. So kann er Kontakte anlegen, die entweder von den anderen Gruppenmitgliedern einsehbar sind (Firmenkontakte) oder die er nur privat sehen kann (seine Sexgespielinnen usw.). So brauchst Du auch die Struktur der vorhandenen Tabelle nicht zu ändern, weil es da egal ist, wer den Kontakt angelegt hat und weiterhin jede Telefonnummer nur einmal vorkommen kann.

Bei der Darstellung würde ich das dann so machen: Bei der Eingabe hat der Benutzer wie gesagt die gleiche Maske wie bisher, mit der Zusatzoption, wo er den neuen Kontakt eintragen will; zwei Radiobuttons wären sinnvoll, also eine boolean-Auswahl "Gruppenliste"/"private Liste". Und beim Eintragen natürlich abfragen, ob die Telefonnummer schon in der eigenen privaten oder in der Gruppenliste vorhanden ist. Ist sie in der Gruppenliste bereits drin, muß sie ja nicht in die private Liste. Wäre nicht schlimm, aber unschön, wenn Du die Ausgabe noch auf Duplikate checken mußt, ist einfach unnötig. In einer anderen privaten darf sie ruhig vorkommen, immerhin wollen ja evtl. mehrere Leute die gleiche Geliebte eintragen, und es wäre unschön, dann zu erfahren, daß die schon vergeben ist^^. Bei der Ausgabe einer Abfrage nach z.B. "Meier" werden alle Meiers gelistet, die in der Gruppenliste und der privaten Liste des Abfragers vorkommen, und dabei die aus der privaten besonders gekennzeichnet (gelb hinterlegt oder was weiß ich).

Und Du bräuchtest evtl. noch die Funktion für den User, Datensätze in seiner eigenen privaten Liste zu löschen und einen Datensatz aus der privaten in die Gruppenliste zu verschieben. Andersrum eher nicht, weil er dann ja Daten den anderen Gruppenmitgliedern entzieht und Du nicht feststellen kannst, welchen Datensatz er eingestellt hat. Es kann natürlich jetzt zu Fehleinträgen kommen, wenn jemand einen privaten Kontakt eintragen will und versehentlich die Gruppenliste gewählt hat. Aber da sowohl das Sicherheitsniveau ggü. den anderen Gruppenmitgliedern wohl nicht irre hoch sein muß und außerdem im Notfall ein Admin greifbar wäre (irgendein Vertrauenswürdiger wird ja wohl ermächtigt sein, Datensätze aus der Gruppentabelle zu löschen), tut es wohl eine einfache HTML-Abfrage "Daten werden in Gruppenliste eingetragen und sind für andere sichtbar, sind sie sicher? Fortfahren/Abbrechen", falls die Option ausgewählt wurde.

Code erspar ich mir mal, ist schon ein paar Jahre her, daß ich mit SQL rumgehampelt habe. :]

PS: Übrigens ist es nicht gut, das Schlüsselwort "name" auch als Bezeichung zu verwenden. Etwas längere, aussagefähige Variablennamen haben dem Codeverständnis nebenbei noch nie geschadet.
 
Code:
INSERT INTO test (id, number, name, street, areacode, city, extension)  VALUES ('$argid', '$_[0]', '$resultoertname', '$resultoertstreet',  '$resultoertareacode', '$resultoertcity', '$argext') ON DUPLICATE KEY  UPDATE  name=VALUES(name),street=VALUES(street),areacode=VALUES(areacode),city=VALUES(city),e   xtension=VALUES(extension) );

Wenn die ID nicht da ist, wird einfach nen INSERT gemacht. Brauchst dafür keine neue Zeile. Das Update erfolgt erst wenn die ID schon vorhanden ist. Bzw trifft die Regel mit dem Duplicate immer dann zu wenn ein Feld uniq oder primary ist.
 
Den Gedanken mit den 2 Tabellen hatte ich auch schon aber wenn das mit der id auch hinhaut, spricht doch eigentlich nichts dagegen oder?
 
Zurück
Oben Unten