SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 13.06.2008, 11:53:13
Dazmogan Dazmogan ist offline
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
Mit Zitat antworten
  #2  
Alt 13.06.2008, 14:25:18
stb stb ist offline
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 
AND date 1234
LIMIT 1

__________________
Das schwerste ist das Einfachste:

www.rentstock.de

Mit Zitat antworten
  #3  
Alt 13.06.2008, 14:56:36
Dazmogan Dazmogan ist offline
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.
Mit Zitat antworten
  #4  
Alt 13.06.2008, 17:40:13
stb stb ist offline
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?!
__________________
Das schwerste ist das Einfachste:

www.rentstock.de

Mit Zitat antworten
  #5  
Alt 14.06.2008, 10:52:24
Dazmogan Dazmogan ist offline
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)
Mit Zitat antworten
  #6  
Alt 14.06.2008, 17:54:40
stb stb ist offline
Anfänger
 
Registriert seit: May 2008
Beiträge: 40
AW: REPLACE INTO mit mehreren Unique-Keys

PHP-Code:
CREATE TABLE IF NOT EXISTS `test` (
  `
userIDint(3unsigned NOT NULL auto_increment,
  `
actionvarchar(30NOT NULL,
  `
valueint(3unsigned NOT NULL,
  `
dateint(4unsigned NOT NULL,
  
PRIMARY KEY  (`userID`),
  
KEY `date` (`date`)
ENGINE=MyISAM  DEFAULT CHARSET=utf8  
PHP-Code:
REPLACE INTO 
    test
SET
    userID 
1action 'jump'value 5, `date` = 1234 
Funktioniert einwandfrei als insert oder -wenn iserID vorhanden- als replace
__________________
Das schwerste ist das Einfachste:

www.rentstock.de

Mit Zitat antworten
  #7  
Alt 14.06.2008, 21:09:13
Dazmogan Dazmogan ist offline
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 Beitrag anzeigen
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.
Mit Zitat antworten
  #8  
Alt 14.06.2008, 22:14:01
stb stb ist offline
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 AND date 1234 GROUP BY userID LIMIT 1
testen, ob es schon einen Eintrag gibt und entsprechend handeln. ;)
__________________
Das schwerste ist das Einfachste:

www.rentstock.de

Mit Zitat antworten
  #9  
Alt 15.06.2008, 13:48:07
Dazmogan Dazmogan ist offline
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 Beitrag anzeigen
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 :)
Mit Zitat antworten
  #10  
Alt 15.06.2008, 19:14:18
Dazmogan Dazmogan ist offline
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));                    
                } 
Mit Zitat antworten
Antwort


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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
"Verschachtelte" Selects über 3 Tabellen Mattes1001 MySQLi/PDO/(MySQL) 6 09.06.2008 16:22:46
Die zwei besten Werte pro Land frank2342 MySQLi/PDO/(MySQL) 4 14.05.2008 16:30:44
REPLACE INTO - error in your sql syntax phpTippse MySQLi/PDO/(MySQL) 3 09.07.2007 14:30:18
Menüstruktur aus Datenbank rekursiv auslesen daf555 PHP Entwicklung und Softwaredesign 3 26.02.2006 13:04:25


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:51:36 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt