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

pq
 2012-05-26 00:23
#158624 #158624
User since
2003-08-04
12207 Artikel
Admin1
[Homepage]
user image
2012-05-25T21:25:27 rosti
Zurück zu MySQL, die Last_Insert_Id abzufragen ist eine einfache Möglichkeit, herauszufinden, ob ein Insert stattgefunden hat, bei einem Update liefert diese Anfrage eine 0.

doku?
ich schrieb ja schon oben, dass last_insert_id nur etwas sinnvolles liefert, wenn ein insert stattgefunden hat. andernfalls liefert es einfach die insert id vom letzten "echten" insert.
http://dev.mysql.com/doc/refman/5.1/en/insert-on-d...

hier ein test. zuerst ein insert in eine andere tabelle bar, danach ein insert in foo, welches ein update macht:
Code: (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
mysql> select * from foo;
+----+------+
| id | name |
+----+------+
| 1 | foo |
| 2 | foo1 |
| 3 | foo2 |
+----+------+
3 rows in set (0.00 sec)

mysql> insert into bar (name) VALUES ("test");
Query OK, 1 row affected (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)

mysql> insert into foo (name) VALUES ("foo") on duplicate key update name=name;
Query OK, 0 rows affected (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 3 |
+------------------+
1 row in set (0.00 sec)

last_insert_id liefert 3. man muss also den dokumentierten workaround bemühen:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
mysql> insert into foo (name) VALUES ("foo") on duplicate key update name=name, id=LAST_INSERT_ID(id);
Query OK, 0 rows affected (0.00 sec)

mysql> select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)


wie gesagt, es ist nicht trivial, und wenn du es benutzt, solltest du dir über sowas im klaren sein.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

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