hi Tom,
Wozu das nun gut sein soll, oder ob es nur ein Bug ist, weiß ich noch nicht. Vielleicht hast Du ja eine Idee.
Es soll weder ein Update erfolgen, noch eine neue ID bei vorhandenem Unique Key vergeben werden. Sinn und Zweck also:
Detailtabelle 'user' befüllen, wenn ident(user_id, user_name) bereits vorhanden sind, soll die (vorhandene)id zurückgegeben werden. Wenn ident() neu ist, soll ident(user_id, user_name) eingefügt werden und die (neue)id zurückgegeben werden.
Hier nochmal die Tabelle:
CREATE TABLE user(
id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL DEFAULT '',
user_id VARCHAR(50) NOT NULL DEFAULT '',
PRIMARY KEY (id),
UNIQUE KEY ident(user_name, user_id)
)DEFAULT CHARSET=UTF8
Das Statement:
my $STH_INSERT_ON_DUPLICATE_KEY = $DBH->prepare(
q(
INSERT INTO user(user_id, user_name)VALUES(?,?)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)
)
);
und die Funktion:
sub insert_user{
state %cache; # 5.010
my $r = shift;
$cache{$r->{user_id}.$r->{user_name}} ||= eval{
# print "Anfrage\n"; # cache testen
$STH_INSERT_ON_DUPLICATE_KEY->execute($r->{user_id}, $r->{user_name});
$DBH->selectrow_array("SELECT LAST_INSERT_ID()");
};
return $@ ? undef : $cache{$r->{user_id}.$r->{user_name}};
}
LAST_INSERT_ID() hat hier eine Doppelrolle:
LAST_INSERT_ID()
LAST_INSERT_ID(expr)
Hotti