INSERT INTO ... ON DUPLICATE KEY UPDATE ... schlägt fehl


#1

server-spec:
OS: openSuse 13.2-tumbleweed
db-server: mysql-opensuse v.5.6.28

Mahlzeit - ich auch mal hier - WTF?

Tja, bin ja begeisterter Half-Life-fanboi und des Mods Sven Co-Op. Da ich selbst einen root habe und dort natürlich einen Server drauf laufen lasse wollte ich, nach dem ich nun lange genug Stabilitätstests durchgeführt habe den bekannten XP-Mod mit einbinden - und prompt gleich beim ersten Test knall ich auf die Nase.

Das DB-Backend nutzt zwei Queries:

[sql]#define QUERY_SELECT_SKILLS “SELECT xp, playerlevel, skillpoints, medals, health, armor, rhealth, rarmor, rammo, gravity, speed, dist, dodge FROM %s WHERE %s”
#define QUERY_UPDATE_SKILLS “INSERT INTO %s (uniqueid) VALUES (’%s’) ON DUPLICATE KEY UPDATE authid =’%s’,nick=’%s’,ip=’%s’,xp=’%d’,playerlevel=’%d’,skillpoints=’%d’,medals=’%d’,health=’%d’,armor=’%d’,rhealth=’%d’,rarmor=’%d’,rammo=’%d’,gravity=’%d’,speed=’%d’,dist=’%d’,dodge=’%d’”[/sql]

Und das meint mein MySQL-Server zum insert:

[sql]INSERT INTO scxpm_stats (uniqueid) VALUES (‘STEAM_0:0:17251289’) ON DUPLICATE KEY UPDATE authid =‘STEAM_0:0:17251289’,nick=‘Sen-Mithrarin’,ip=‘213.211.229.14’,xp=‘0’,playerlevel=‘0’,skillpoints=‘0’,medals=‘4’,health=‘0’,armor=‘0’,rhealth=‘0’,rarmor=‘0’,rammo=‘0’,gravity=‘0’,speed=‘0’,dist=‘0’,dodge=‘0’[/sql]
-> [inline]1.Unerkanntes Schlüsselwort. (near “KEY” at position 78)[/inline] (mit phpMyAdmin 4.5.5.1)

Ich hab schon in der Doc zu meiner Server-Version nachgelesen - und mit copy’n’paste um Tippfehler auszuschließen. Ich hab auch versucht nach dem Fehler zu googlen - aber leider ist mein Such-String scheinbar zu komplex für Google und es kommen leider keine brauchbaren Ergebnisse (bin garantiert einfach mal wieder zu blöd n halbwegs sinnvollen Such-String einzugeben).

Da laut Doc das Command unterstützt werden müsste - mein Server aber meldet dass er es scheinbar nicht kennt - wundere ich mich halt woran es liegen könnte.

//ps - neues anti-spam-plugin? mir wird gerade unten neben dem save-button n hinweis-text angezeigt ~ denke liegt wohl dran weil ich erste mal von meinem rechner über meine neue IP post (wobei - hab ich auch schon übers handy ~ komisch)

– EDIT

Sehr merkwürdig: führe ich die Query vom cli aus bekomme ich plötzlich:
[inline]ERROR 1364 (HY000): Field ‘authid’ doesn’t have a default value[/inline]
Was geht denn bitte hier ab? - Ich versuchs mal mit default-values.

btw: Ja, den Fehler mit dem Leerzeichen zwischen authid und = hab ich bereits gefixt - daran liegts leider nicht.


#2

die zweite Fehlermeldung wäre ja noch normal wenn du
[sql]INSERT INTO scxpm_stats (uniqueid) VALUES (‘STEAM_0:0:17251289’)[/sql]
für sich ausführst, wie sollen da die anderen Felder für den neuen Eintrag belegt werden?
authid ist doch dann sicher auch NON NULL?


#3

Ja, wollte gerade noch die Table an sich posten - warst n bissl schneller:
[sql]CREATE TABLE IF NOT EXISTS scxpm_stats (
id int(11) NOT NULL auto_increment,
uniqueid varchar(50) NOT NULL,
authid varchar(24) NOT NULL,
ip varchar(24) NOT NULL,
nick varchar(50) NOT NULL,
xp bigint(20) NOT NULL default ‘0’,
playerlevel int(11) NOT NULL default ‘0’,
skillpoints int(11) NOT NULL default ‘0’,
medals tinyint(4) NOT NULL default ‘4’,
health int(11) NOT NULL default ‘0’,
armor int(11) NOT NULL default ‘0’,
rhealth int(11) NOT NULL default ‘0’,
rarmor int(11) NOT NULL default ‘0’,
rammo int(11) NOT NULL default ‘0’,
gravity int(11) NOT NULL default ‘0’,
speed int(11) NOT NULL default ‘0’,
dist int(11) NOT NULL default ‘0’,
dodge int(11) NOT NULL default ‘0’,
lastUpdated timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uniqueid (uniqueid)
) ENGINE=InnoDB AUTO_INCREMENT=1;[/sql]
Meinste daran liegts dass halt kein default vorhanden ist? Werd ich mal testen.

*** Edit ***

Hab mal die Table um folgende defaults erweitert:
[sql]CREATE TABLE IF NOT EXISTS scxpm_stats (
id int(11) NOT NULL auto_increment,
uniqueid varchar(50) NOT NULL default ‘ID/IP/Nick’,
authid varchar(24) NOT NULL default ‘STEAM_invalid’,
ip varchar(24) NOT NULL default ‘000.000.000.000’,
nick varchar(50) NOT NULL default ‘~’,
xp bigint(20) NOT NULL default ‘0’,
playerlevel int(11) NOT NULL default ‘0’,
skillpoints int(11) NOT NULL default ‘0’,
medals tinyint(4) NOT NULL default ‘4’,
health int(11) NOT NULL default ‘0’,
armor int(11) NOT NULL default ‘0’,
rhealth int(11) NOT NULL default ‘0’,
rarmor int(11) NOT NULL default ‘0’,
rammo int(11) NOT NULL default ‘0’,
gravity int(11) NOT NULL default ‘0’,
speed int(11) NOT NULL default ‘0’,
dist int(11) NOT NULL default ‘0’,
dodge int(11) NOT NULL default ‘0’,
lastUpdated timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (id),
UNIQUE KEY uniqueid (uniqueid)
) ENGINE=InnoDB AUTO_INCREMENT=1;[/sql]
Jetzt funzt es ohne Probleme. Danke für den Hint mit dem fehlenden default (wer auch immer den code gebastelt hat muss entweder kein Test gemacht haben oder hatte 'n merkwürdiges DB-setup).

~ solved