Thread Insert Into... On Duplicate Key Update... (20 answers)
Opened by rosti at 2012-05-25 20:39

rosti
 2012-05-26 12:54
#158630 #158630
User since
2011-03-19
3194 Artikel
BenutzerIn
[Homepage]
user image
Quote
das ist wieder so ein punkt, der pauschal überhaupt nicht gilt. ich habe einen string, will ihn in einer tabelle ablegen und brauche die id, um in einer weiteren tabelle einen neuen datensatz mit dieser id einzufügen. und dabei ist es für die weitere tabelle total uninteressant, ob der datensatz neu ist oder schon da war. ich brauche in jedem fall die id, auch wenn kein insert stattgefunden hat.


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)

View full thread Insert Into... On Duplicate Key Update...