#!/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