CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
13.06.2008, 11:53:13
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
REPLACE INTO mit mehreren Unique-Keys
Hallihallo,
also ich habe einen Table, der sieht so aus:
Code:
CREATE TABLE IF NOT EXISTS `test` (
`userID` int(3) unsigned NOT NULL,
`action` varchar(30) NOT NULL,
`value` int(3) unsigned NOT NULL,
`date` int(4) unsigned NOT NULL,
KEY `userID` (`userID`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
(date wird später noch zu einem "richtigen" date-Feld aber das ist für mein Problem irrelevant)
Eine Query könnte nun etwa so aussehen:
Code:
REPLACE INTO
test
SET
userID = 1, action = 'jump', value = 5, `date` = 1234
Diese Query soll aktualisieren, wenn es einen Eintrag mit dieser userID UND diesem Datum bereits gibt - tut sie nur leider nicht. Geht das überhaupt?
Achja: Ich weiß, dass es mit 2 Queries sehr leicht geht, indem ich erst ausles und anhand des Ergebnis entweder UPDATE oder INSERTe aber darum geht es nicht - ich möchte wissen, ob es mit einer Query geht :)
Grüße
Dazmogan
|
13.06.2008, 14:25:18
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
PHP-Code:
UPDATE test
SET action = 'jump', value = 5
WHERE userID = 1 AND date = 1234
LIMIT 1;
|
13.06.2008, 14:56:36
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Das hat aber nicht die REPLACE INTO Funktionalität sondern kann nur bereits vorhandene Datensätze aktualisieren - aber keine neuen einfügen.
|
13.06.2008, 17:40:13
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
http://dev.mysql.com/doc/refman/5.1/de/replace.html
" Beachten Sie, dass, sofern die Tabelle nicht einen Primärschlüssel oder einen eindeutigen Index hat, die Verwendung von REPLACE unsinnig ist. Die Anweisung wäre dann mit INSERT identisch, weil kein Index vorhanden ist, anhand dessen bestimmt werden könnte, ob ein neuer Datensatz ein Duplikat eines bereits vorhandenen darstellt. "
Vieleicht fehlt bei dir der Primärschlüssel und ein Index?!
|
14.06.2008, 10:52:24
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Ich habe ja bereits die Tabellenstruktur gepostet:
Code:
CREATE TABLE IF NOT EXISTS `test` (
`userID` int(3) unsigned NOT NULL,
`action` varchar(30) NOT NULL,
`value` int(3) unsigned NOT NULL,
`date` int(4) unsigned NOT NULL,
KEY `userID` (`userID`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
An der vorletzten Zeile sollte erkennbar sein, dass ich Indizes über die Spalten userID und date gelegt habe. Einen Primärschlüssel habe ich nicht, da keine der Spalten für sich selbst unique ist. Ich müsste eine Extraspalte einführen, wobei ich mir nicht vorstellen kann, dass das was bringt.
/update: habs ausprobiert, hat nichts gebracht
Geändert von Dazmogan (14.06.2008 um 11:08:49 Uhr)
|
14.06.2008, 17:54:40
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
PHP-Code:
CREATE TABLE IF NOT EXISTS `test` (
`userID` int(3) unsigned NOT NULL auto_increment,
`action` varchar(30) NOT NULL,
`value` int(3) unsigned NOT NULL,
`date` int(4) unsigned NOT NULL,
PRIMARY KEY (`userID`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
PHP-Code:
REPLACE INTO
test
SET
userID = 1, action = 'jump', value = 5, `date` = 1234
Funktioniert einwandfrei als insert oder -wenn iserID vorhanden- als replace
|
14.06.2008, 21:09:13
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Vielen Dank aber das weiß ich bereits und löst mein Problem nicht. Ich zitiere einfach mal die schwierige Stelle:
Zitat:
Zitat von Dazmogan
Diese Query soll aktualisieren, wenn es einen Eintrag mit dieser userID UND diesem Datum bereits gibt
|
Gewissermaßen zwei Primärschlüssel, was natürlich strukturmäßig nicht geht. Die Frage ist, ob man REPLACE INTO so nutzen kann, als ob userID und date als geordnetes Paar als Primärschlüssel betrachtet werden können.
|
14.06.2008, 22:14:01
|
Anfänger
|
|
Registriert seit: May 2008
Beiträge: 40
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Also, bevor ich mich so lange mit einem so schnöden Problem aufhalte,
das mit einem erforderlichen uniqe key auf einer date-spalte schon mal ohnehin keinen Sinn macht, hätte ich die sache schon lange so gelöst:
Mit
PHP-Code:
SELECT COUNT(userID) > 0 FROM test WHERE userID = 1 AND date = 1234 GROUP BY userID LIMIT 1;
testen, ob es schon einen Eintrag gibt und entsprechend handeln. ;)
|
15.06.2008, 13:48:07
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Auch dazu habe ich schon etwas geschrieben:
Zitat:
Zitat von Dazmogan
Achja: Ich weiß, dass es mit 2 Queries sehr leicht geht, indem ich erst ausles und anhand des Ergebnis entweder UPDATE oder INSERTe aber darum geht es nicht - ich möchte wissen, ob es mit einer Query geht :)
|
|
15.06.2008, 19:14:18
|
Anfänger
|
|
Registriert seit: Jun 2008
Alter: 36
Beiträge: 7
|
|
AW: REPLACE INTO mit mehreren Unique-Keys
Ich habe jetzt noch eine andere Lösung gefunden, die aufgrund der Umstände wahrscheinlich sogar performanter ist. Bei mir wird deutlich häufiger ein UPDATE als ein INSERT vorkommen. UPDATES sind mit REPLACE aber sehr aufwändig, da intern erst ein DELETE und anschließend ein INSERT ausgeführt wird.
Bei gleich folgender Variante wird in den meisten Fällen nur ein UPDATE ausgeführt werden.
PHP-Code:
$db->query(sprintf('
UPDATE
test
SET
value = value + %d
WHERE
action = "%s"
AND
value = %d
AND
`date` = now()
', $value, $this->userID, $key));
if (!$db->affectedRows()) {
$db->query(sprintf('
INSERT INTO
test
SET
value = %d,
action = "%s",
value = %d,
`date` = now()
', $value, $this->userID, $key));
}
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 08:51:36 Uhr.
|