Thread Insert Into... On Duplicate Key Update...
(20 answers)
Opened by rosti at 2012-05-25 20:39 Quote Ja, klar. Wenn Du die referenzielle Integrität über IDs herstellst, die aus einem auto_increment resultieren, ja, dann wird Dir wohl nichts anderes übrigbleiben, als das so zu machen (wie es alle machen) ;) Schönen Sonntag. PS/Edit, Das Leben ist Veränderung (danke Falco): Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use DBI; local $\ = local $, = "\n"; my $DBH = dbh(); my $q = q( INSERT INTO test(text)VALUES(?) ON Duplicate Key UPDATE text=? ); my $STH = $DBH->prepare($q); my $ins = '12asdf'; # Zum Testen Werte ändern.... my $state = $STH->execute($ins, $ins); # case state: 1 INSERT, 2 UPDATE if($state == 2){ print "Es war ein Update, wir brauchen die ID mit einer weiteren Abfrage!"; my $id = $DBH->selectrow_array("SELECT id FROM test WHERE text=?", {}, $ins); print "Hier ist sie: $id"; } elsif($state == 1){ print "Es war ein Insert, wir brauchen die ID als Last_Insert_Id!"; my $id = $DBH->selectrow_array("SELECT LAST_INSERT_ID()"); print "Hier ist sie: $id"; } else{ die "Wiedermal ist alles schiefgegangen!" } # Frage: Mit welchem Feld letztendlich wird die referenzielle Integrität hergestellt? # Antwort: Mit dem Feld, welches in der Haupt-Tabelle als Unique Key definiert ist! # Nächste Frage: Wozu brauchen wir dann einen auto_increment Wert? # Antwort 1: Wenn wir alles so lassen wie es ist, brauchen wir die auto_increment ID. # Antwort 2: Wenn wir das DB-Design geschickt ändern, brauchen wir diese ID nicht mehr. ########################################################################### sub dbh{ my $class = shift; # Name der o.g. Package my %cfg = ( base => 'myweb', host => 'localhost', port => 3306, user => '', pass => '', @_); my $dbh = undef; eval{ $dbh = DBI->connect("DBI:mysql:$cfg{base}:$cfg{host}:$cfg{port}", $cfg{user}, $cfg{pass}, {RaiseError => 1, PrintError => 0} ); }; return $@ ? undef : $dbh; } __END__ CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `text` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`id`), UNIQUE KEY `text` (`text`) ) ENGINE=MyISAM AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 Last edited: 2012-05-26 13:14:11 +0200 (CEST) |