use Mosche;
ich habe mich gefragt, wie man es am effizientesten schaffen kann, dass doppelte Einträge in einer mySQL DB vermieden werden?
Bei dieser Fragestelung gibt es zwei Seiten:
a) dein Datenbanklayout:
beim erstellen der Tabelle gibst du beim Attribut, welches einzigartig sein soll, "unique" an. Dann _kannst_ du dort nichts doppeltes einfügen.
Auch möglich, mehrere Felder gemeinsam als einzigartig zu kennzeichnen - das ist üblicherweise der Schlüssel (schau in die MySQL-Dokumentation unter dem Stichwort "Primary KEY").
Bsp:
CREATE TABLE blah (
vorname varchar(80) UNIQUE,
nachname varchar(80) UNIQUE
);
b) dein Programm:
Du musst (wie im anderen Tip) vorher abfragen, ob der entsprechende Schlüssel (wie gesagt, das ist meistens das "einzigartige" Feld) bereits vorhanden ist. Wenn du damit rechnest, dass es konkurrierende Zugriffe gibt, dann arbeitest du mit Transaktionen (inwiefern MySQL diese beherrscht, weiß ich nicht. Vor einiger Zeit konnte MySQL dies nicht, habe aber gehört, einige Tabellentypen würden Transaktionen beherrschen. Kann ich persönlich nicht verifizieren, benutze selbst meistens PostgreSQL).
BEGIN WORK; -- startet die Transaktion
SELECT dein_schluessel FROM blah WHERE dein_schluessel = "neuer schluessel";
-- jetzt mit Perl testen, ob es geklappt hat
INSERT INTO blah VALUES ("neuer schluessel");
COMMIT;
c) ggf. hat deine Datenbank Features, die das Select und Insert zusammenfassen - meine mich zu erinnern, dass irgendwo gesehen zu haben, weiß aber nicht, welche DB, und bezweifle, dass dies MySQL war. Im SQL Standard ist es nicht vorgesehen.
INSERT INTO haupttabelle (vorname,nachname) VALUES (?,?) WHERE vorname NOT "$input_vor" AND nachname NOT "$input_nach"
INSERT ... WHERE gibt es allgemein nicht.
use Tschoe qw(Matti);
Anyone who quotes me in their sig is an idiot. -- Rusty Russell.