Frage zu "ON DUPLICATE KEY"

Frage zu "ON DUPLICATE KEY"

am 17.08.2007 13:34:18 von Thomas Barth

Hallo,
um einen Select vor einem Insert oder einem Update zu vermeiden, möchte
ich nun mit "ON DUPLICATE KEY" Insert und Update zusammenfassen.
Getrennt sehen die beiden Anfragen so aus:

INSERT INTO agent_customers(date_time, customer_id, mt_cnt, agent_id)
VALUES('2007-08-17 13:02:37', '1', 1, 3);

UPDATE agent_customers
SET mt_cnt = mt_cnt + 1,
date_time = '2007-08-17 13:02:37'
WHERE customer_id = 1 AND agent_id = 3;


Angewendet werden sie auf folgende Tabelle
+-------------+------------------+------+-----+------------- --------+
| Field | Type | Null | Key | Default |
+-------------+------------------+------+-----+------------- --------+
| date_time | datetime | NO | | 2007-01-01 00:00:00 |
| customer_id | int(10) unsigned | NO | PRI | 0 |
| mt_cnt | mediumint(9) | NO | | 0 |
| agent_id | int(10) unsigned | NO | PRI | 0 |
+-------------+------------------+------+-----+------------- --------+

Hier die Zusammenfassung:

INSERT INTO agent_customers(date_time, customer_id, mt_cnt, agent_id)
VALUES('2007-08-17 13:02:37', 1, 1, 3)
ON DUPLICATE KEY
UPDATE agent_customers SET mt_cnt = mt_cnt + 1, date_time = '2007-08-17
13:02:37';

Da customer_id und agent_id als PRIMARY KEY definiert sind, habe ich sie
beim UPDATE weggelassen. Warum erhalte ich immer einen Syntaxfehler?

You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'SET
mt_cnt=mt_cnt+1' at line 1


Es heißt doch schließlich laut Doku

INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;

(http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate. html)

MySQL Version ist 5.0.44

Thomas B

Re: Frage zu "ON DUPLICATE KEY"

am 17.08.2007 13:41:35 von Thomas Rachel

Thomas Barth schrieb:

> Hier die Zusammenfassung:
>
> INSERT INTO agent_customers(date_time, customer_id, mt_cnt, agent_id)
> VALUES('2007-08-17 13:02:37', 1, 1, 3)
> ON DUPLICATE KEY
> UPDATE agent_customers SET mt_cnt = mt_cnt + 1, date_time = '2007-08-17
> 13:02:37';
>
> Da customer_id und agent_id als PRIMARY KEY definiert sind, habe ich sie
> beim UPDATE weggelassen. Warum erhalte ich immer einen Syntaxfehler?
>
> You have an error in your SQL syntax; check the manual that corresponds
> to your MySQL server version for the right syntax to use near 'SET
> mt_cnt=mt_cnt+1' at line 1
>
>
> Es heißt doch schließlich laut Doku
>
> INSERT INTO table (a,b,c) VALUES (1,2,3)
> ON DUPLICATE KEY UPDATE c=c+1;

Eben.

ON DUPLICATE KEY UPDATE eben.

Du schreibst jedoch

ON DUPLICATE KEY UPDATE SET .


Die Tabelle wird bei dieser Syntax jedoch schon im INSERT-Statement
angegeben und kann (muß!) daher weggelassen werden.

-> Also: ... ON DUPLICATE KEY UPDATE mt_cnt = mt_cnt + 1, date_time =
'2007-08-17 13:02:37'


HTH,


Thomas

Re: Frage zu "ON DUPLICATE KEY"

am 17.08.2007 14:09:42 von Claus Reibenstein

Thomas Barth schrieb:

> INSERT [...]
> ON DUPLICATE KEY
> UPDATE agent_customers SET [...]
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

> Es heißt doch schließlich laut Doku
>
> INSERT INTO table (a,b,c) VALUES (1,2,3)
> ON DUPLICATE KEY UPDATE c=c+1;

Eben. Dort steht nach UPDATE weder ein Tabellenname noch SET.

Gruß. Claus

Re: Frage zu "ON DUPLICATE KEY"

am 17.08.2007 14:14:37 von Thomas Barth

Thomas Rachel wrote:
> Thomas Barth schrieb:
>
>
>>
>>
>> Es heißt doch schließlich laut Doku
>>
>> INSERT INTO table (a,b,c) VALUES (1,2,3)
>> ON DUPLICATE KEY UPDATE c=c+1;
>
> Eben.
>
> ON DUPLICATE KEY UPDATE eben.
>
> Du schreibst jedoch
>
> ON DUPLICATE KEY UPDATE SET .
>
>

Wie blöd, danke!

Thomas B