ON DUPLICATE KEY

ON DUPLICATE KEY

am 15.09.2007 18:29:15 von Albert Hermeling

Guten Abend,

ich bin, was SQL Betrifft, blutiger Anfänger. Um mich jetzt mit SQL vertraut
zu machen habe ich in MySQL (Ver 14.12 Distrib 5.0.26, for suse-linux-gnu
(x86_64)) eine kleine Datenbank Namens test mit der Tabelle foobar
angelegt. Diese Tabelle soll jetzt über die Kommandozeile von MySQL mit
Daten befühlt werden. "Normale" INSERT Anweisungen funktionieren
einwandfrei :-).

Für das neu anlegen bzw. aktualisieren von schon bestehenden Datensetzen
nehme ich folgenden SQL Befehl:

INSERT INTO foobar (index, word, anzahl) VALUES
(8410158949543912268,"albert",1) ON DUPLICATE KEY UPDATE anzahl=anzahl+1;

In der Tabelle foobar sollen in den Spalten index, word, anzahl die Werte
ein 8410158949543912268,"albert",1 eingefügt werden. Ist der
Primärschlüssel index schon vorhanden dann soll die Spalte anzahl um 1
erhöht werden. So weit so gut nur wenn ich den Befehl abschicke bekomme ich
ein "Fehler in der SQL-Syntax" gemeldet.

Es Ist ist warscheinlich ein sehr einfacher Fehler, nur ich komme nicht
drauf :-(. Schon mal danke für die Hilfe.

MfG

Albert

Re: ON DUPLICATE KEY

am 15.09.2007 22:19:51 von Claus Reibenstein

Albert Hermeling schrieb:

> INSERT INTO foobar (index, word, anzahl) VALUES
> (8410158949543912268,"albert",1) ON DUPLICATE KEY UPDATE anzahl=anzahl+1;
^ ^

Setze hier mal einfache Anführungszeichen ein.

> [...] wenn ich den Befehl abschicke bekomme ich
> ein "Fehler in der SQL-Syntax" gemeldet.

Bitte _immer_ die _komplette_ Fehlermeldung im Original zitieren. Das
ist per Copy&Paste schnell erledigt und erleichtert uns, die wir hier
unsere freie Zeit investieren, um Anderen zu helfen, die Arbeit.

> Es Ist ist warscheinlich ein sehr einfacher Fehler, nur ich komme nicht
> drauf :-(

Ist es, und trotzdem habe ich erst einmal eine Weile ratlos davor
gesessen und den Fehler nicht bemerkt, weil "Fehler in der SQL-Syntax"
einfach zu dürftig war.

Gruß. Claus

Re: ON DUPLICATE KEY

am 15.09.2007 22:53:58 von Andreas Scherbaum

Hallo,

Albert Hermeling wrote:
>
> ich bin, was SQL Betrifft, blutiger Anfänger. Um mich jetzt mit SQL vertraut
> zu machen

Nun ja, möchtest du dich mit MySQL oder mit SQL vertraut machen?
Denn:

> INSERT INTO foobar (index, word, anzahl) VALUES
> (8410158949543912268,"albert",1) ON DUPLICATE KEY UPDATE anzahl=anzahl+1;
>
> In der Tabelle foobar sollen in den Spalten index, word, anzahl die Werte
> ein 8410158949543912268,"albert",1 eingefügt werden. Ist der
> Primärschlüssel index schon vorhanden dann soll die Spalte anzahl um 1
> erhöht werden. So weit so gut nur wenn ich den Befehl abschicke bekomme ich
> ein "Fehler in der SQL-Syntax" gemeldet.
>
> Es Ist ist warscheinlich ein sehr einfacher Fehler, nur ich komme nicht
> drauf :-(. Schon mal danke für die Hilfe.

Der passende (und portable) Weg wäre:

- Transaktion starten
- Prüfen, ob Key vorhanden
- Wenn ja, Update
- Wenn nein, Insert
- Transaktion abschliessen.

SQL 2003 bringt dann wohl auch ein MERGE, mal schauen, wann das seinen Weg
findet.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: ON DUPLICATE KEY

am 16.09.2007 11:36:48 von dnoeth

Andreas Scherbaum wrote:

> SQL 2003 bringt dann wohl auch ein MERGE, mal schauen, wann das seinen Weg
> findet.

Hat es schon :-)
Zumindest bei Oracle, DB2, Teradata, MS SQL in der nächsten Version

Dieter

Re: ON DUPLICATE KEY

am 16.09.2007 12:34:19 von Andreas Scherbaum

Dieter Noeth wrote:
> Andreas Scherbaum wrote:
>
>> SQL 2003 bringt dann wohl auch ein MERGE, mal schauen, wann das seinen Weg
>> findet.
>
> Hat es schon :-)
> Zumindest bei Oracle, DB2, Teradata, MS SQL in der nächsten Version

Und MySQL?
Darum geht es in dieser Newsgroup imho ;-)


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: ON DUPLICATE KEY

am 17.09.2007 10:19:27 von Albert Hermeling

Andreas Scherbaum wrote:

> Hallo,
>
> Albert Hermeling wrote:
>>
>> ich bin, was SQL Betrifft, blutiger Anfänger. Um mich jetzt mit SQL
>> vertraut zu machen
>
> Nun ja, möchtest du dich mit MySQL oder mit SQL vertraut machen?
> Denn:
Ich möchte mich mit MySQL vertraut machen. Daher ist die Portabilität erst
mal zweitrangig.

MfG

Albert

Re: ON DUPLICATE KEY

am 17.09.2007 10:36:17 von Albert Hermeling

Claus Reibenstein wrote:

> Albert Hermeling schrieb:

Guten Morgen Claus,

>> INSERT INTO foobar (index, word, anzahl) VALUES
>> (8410158949543912268,"albert",1) ON DUPLICATE KEY UPDATE anzahl=anzahl+1;
> ^ ^
>
> Setze hier mal einfache Anführungszeichen ein.
Also wenn ich einfache Anführungszeichen | ' | in die Zahl einfüge gibt es
bei mir den gleichen SQL-Fehler. Vieleicht werden die beiden Caret Zeichen
nicht an der Richtigen Position dargestellt. Bei mir Funktionierts nicht.

> Bitte _immer_ die _komplette_ Fehlermeldung im Original zitieren.
Hier noch mal der SQL-Befehl der den Fehler produziert:

INSERT INTO foobar (index, word, anzahl) VALUES
(8410158949543912268, 'albert', 1) ON DUPLICATE KEY UPDATE anzahl = anzahl
+ 1;

Hier die komplette Fehlermeldung:

ERROR 1064 (42000): Fehler in der SQL-Syntax. Bitte die korrekte Syntax im
Handbuch nachschlagen bei 'index, word, anzahl) VALUES
(8410158949543912268, 'albert', 1) ON DUPLICATE KEY ' in Zeile 1

Hier das Chreate Skript das die Tabelle foobar in der Datenbnak test
erzeugt:

CREATE TABLE `foobar` (
`index` bigint(20) NOT NULL COMMENT 'Zum Testen',
`word` varchar(60) NOT NULL COMMENT 'Das Word',
`anzahl` int(11) NOT NULL COMMENT 'Anzahl der Wörter',
PRIMARY KEY (`index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


>
>> Es Ist ist warscheinlich ein sehr einfacher Fehler, nur ich komme nicht
>> drauf :-(
>
> Ist es, und trotzdem habe ich erst einmal eine Weile ratlos davor
Tja und ich bin immer noch ratlos und ein bisschen genervt über meine eigene
Blödheit :-((

MfG

Albert

Re: ON DUPLICATE KEY

am 17.09.2007 12:36:18 von Axel Schwenke

Albert Hermeling wrote:
>
> Hier die komplette Fehlermeldung:
>
> ERROR 1064 (42000): Fehler in der SQL-Syntax. Bitte die korrekte Syntax im
> Handbuch nachschlagen bei 'index, word, anzahl) VALUES
> (8410158949543912268, 'albert', 1) ON DUPLICATE KEY ' in Zeile 1

"index" ist ein reserviertes Wort. Mußt du in `Backticks` setzen, damit
MySQL das als Bezeichner akzeptiert.


XL

Re: ON DUPLICATE KEY

am 17.09.2007 14:35:09 von Claus Reibenstein

Albert Hermeling schrieb:

> Claus Reibenstein wrote:
>
>> Bitte _immer_ die _komplette_ Fehlermeldung im Original zitieren.
>
> Hier die komplette Fehlermeldung:

Na also. Geht doch ;-)

> ERROR 1064 (42000): Fehler in der SQL-Syntax. Bitte die korrekte Syntax im
> Handbuch nachschlagen bei 'index, word, anzahl) VALUES

Hier wird das Problem sofort offensichtlich: Er stört sich an dem Wort
"index". Dies ist ein reserviertes Wort.

Wenn Du reservierte Wörter als Bezeichner verwenden möchtest, musst Du
diese in `Backticks` setzen.

>>> Es Ist ist warscheinlich ein sehr einfacher Fehler, [...]
>>
>> Ist es, [...]
>
> Tja und ich bin immer noch ratlos und ein bisschen genervt über meine eigene
> Blödheit :-((

Tja, und hättest Du _gleich_ die komplette Fehlermeldung gepostet,
hätten wir Dir _sofort_ sagen können, was falsch ist.

Gruß. Claus