php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.05.2010, 00:19  
Gesperrt
 
Registriert seit: 15.04.2010
Beiträge: 49
PHP-Kenntnisse:
Anfänger
juice122 ist in Verruf geraten
Standard MySQL: INSERT INTO oder UPDATE verknüpft in einem Query

Hey,

wollte mal wissen ob es möglich ist in einem Query entweder INSERT INTO auszuführen (falls Eintrag noch nicht vorhanden) oder UPDATE (falls eintrag vorhanden) auszuführen.

Das ganze jedoch OHNE on duplicate key entry, da es sich bei den Spalten nicht um Prim. Keys handelt.

Tabellen Struktur sieht folgendermaßen aus:

`id` - `attribute` - `val`

Für alle IDs können verschiedene Attribute u. Werte gespeichert werden:

Code:
ID | attribute | val
1    Attr_1        2
1    Attr_2        5
2    Attr_5        6
2    Attr_8        1
Nun möchte ich z.B. für ID 1 das Attribut 1 um 5 als auch für ID 2 (default value ist 0 von daher wäre es also 0+5) mit demselben Query erhöhen können, da ich im vorhinein nicht mit einem extra Query überprüfen möchte ob die Zeile bereits existiert.

Hab ebenfalls REPLACE gegoogelt, allerdings kann ich da nicht mit WHERE arbeiten.

Ist es generell möglich das zu tun oder muss ich z.B. zunächst ein UPDATE query ausführen und falls keine Zeilen betroffen sind ein INSERT INTO hinterher schmeißen?

Vielen Dank im Vorraus.

Geändert von juice122 (05.05.2010 um 19:01 Uhr).
juice122 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 05.05.2010, 07:31  
thomas_w
Gast
 
Beiträge: n/a
Standard

Schau Dir mal "REPLACE" an.

Code:
REPLACE [LOW_PRIORITY | DELAYED]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...

REPLACE funktioniert auf exakt gleiche Weise wie INSERT. Der Unterschied besteht darin, dass, wenn ein alter Datensatz
denselben Wert wie ein neuer Datensatz für einen Primärschlüssel oder einen eindeutigen Index hat, der alte Datensatz gelöscht
wird, bevor der neue eingefügt wird. Siehe auch Abschnitt 13.2.4,
Grüße
Thomas

Geändert von thomas_w (05.05.2010 um 12:40 Uhr). Grund: CODE Tags repariert
  Mit Zitat antworten
Alt 05.05.2010, 18:46  
Gesperrt
 
Registriert seit: 15.04.2010
Beiträge: 49
PHP-Kenntnisse:
Anfänger
juice122 ist in Verruf geraten
Standard

Sorry meinte natürlich "REPLACE" nicht "REPLACEMENT".

Problem: Meines Wissens nach kann ich REPLACE nicht mit "WHERE" verknüpfen, ist das korrekt?
juice122 ist offline   Mit Zitat antworten
Alt 05.05.2010, 18:50  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

INSERT ja auch nicht. Wozu auch? Im Normalfall kann man im Vorfeld doch die Daten zusammenstellen, die man einfügen will.
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.05.2010, 19:01  
Gesperrt
 
Registriert seit: 15.04.2010
Beiträge: 49
PHP-Kenntnisse:
Anfänger
juice122 ist in Verruf geraten
Standard

Hast du meinen ersten Post gelesen?

Ich kann leider nicht mit REPLACE arbeiten. Würde ich z.B. für ID 1 das Attribut 2 um 5 erhöhen wollen würde das ganze so aussehen:

REPLACE INTO table (`id`,`attr,`val`) VALUES (1,5,`val`+5)

mit dem Ergebnis dass eine neue Zeile hinzukommt:

Code:
ID | attribute | val
1    Attr_1        2
1    Attr_2        5
2    Attr_5        6
2    Attr_8        1
1    Attr_2        5
Das erwünschte Ergebnis wäre jedoch:

Code:
ID | attribute | val
1    Attr_1        2
1    Attr_2        10
2    Attr_5        6
2    Attr_8        1
Und mit dem Query gleicher Art für ID 2 (die Attr_2 noch nicht als Eintrag in der DB hat):

Code:
ID | attribute | val
1    Attr_1        2
1    Attr_2        10
2    Attr_5        6
2    Attr_8        1
2    Attr_2        5

... nur für den Fall dass es überhaupt möglich ist und deswegen frage ich.

Geändert von juice122 (05.05.2010 um 19:08 Uhr).
juice122 ist offline   Mit Zitat antworten
Alt 05.05.2010, 19:30  
thomas_w
Gast
 
Beiträge: n/a
Standard

Bleibt vielleicht noch das Thema BEFORE UPDATE TRIGGER (BUT) und/oder Stored Procedures (SP)

Der Ablauf wäre dann wie folgt:

1. Einen UPDATE mit den neuen Daten ausführen. Dies aktiviert den BUT
2. Findet der BUT mit Hilfe eines SELECT den PK macht er nichts und der UPDATE wird ausgeführt.
3. Findet der BUT den PK nicht, erzeugt er einen INSERT.

Wäre natürlich auch eine eigenes SP dafür sinnvoll.

Mal als Idee...

Grüße
Thomas
  Mit Zitat antworten
Alt 05.05.2010, 19:30  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Du kannst UPDATE und INSERT verwenden. Aber was hat das mit WHERE zu tun?
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--
nikosch ist offline   Mit Zitat antworten
Alt 05.05.2010, 19:55  
Gesperrt
 
Registriert seit: 15.04.2010
Beiträge: 49
PHP-Kenntnisse:
Anfänger
juice122 ist in Verruf geraten
Standard

Zitat:
Zitat von thomas_w Beitrag anzeigen
Bleibt vielleicht noch das Thema BEFORE UPDATE TRIGGER (BUT) und/oder Stored Procedures (SP)

Der Ablauf wäre dann wie folgt:

1. Einen UPDATE mit den neuen Daten ausführen. Dies aktiviert den BUT
2. Findet der BUT mit Hilfe eines SELECT den PK macht er nichts und der UPDATE wird ausgeführt.
3. Findet der BUT den PK nicht, erzeugt er einen INSERT.

Wäre natürlich auch eine eigenes SP dafür sinnvoll.

Mal als Idee...

Grüße
Thomas
Hey,

würde das ganze auf eine IF THEN Anweisung rauslaufen?
Könntest du mir dann die richtige Syntax nennen? Ich google das Problem jetzt schon seit ner Stunde und alle queries die ich darüber finde geben mir Syntax Errors zurück.

Meine IF THEN Anweisung wäre gewesen:

Code:
IF EXISTS(SELECT  * FROM table WHERE Attribut = attr_2 AND id=2)

    BEGIN

       UPDATE table SET val = val+5 WHERE Attribut = attr_2 

    END

    ELSE

    BEGIN

       INSERT INTO table (id, attribut, val) VALUES ('2','attr_2',5)

    END

Funktioniert leider nicht:

Zitat:
#1064 - 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 'IF EXISTS(SELECT * FROM p_inv WHERE item = 5) BEGIN UPDATE p_i' at line 1
(( Auch ohne BEGIN und END - ich bekomme keine IF THEN Anweisung hin, wenn THEN ein Query beinhält. ))

Zitat:
Du kannst UPDATE und INSERT verwenden. Aber was hat das mit WHERE zu tun?
Nochmal: Ich würde gerne in einem MySQL Query das genannte Problem lösen. Soll heißen, wenn z.B. die Zeile Attr_2 für ID 2 schon existiert soll er ein UPDATE des values für ID 2 Attr_2 ausführen.

Wenn die Zeile noch nicht existiert soll er sie neu hinzufügen.
juice122 ist offline   Mit Zitat antworten
Alt 05.05.2010, 20:31  
thomas_w
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von juice122 Beitrag anzeigen
würde das ganze auf eine IF THEN Anweisung rauslaufen?
Sinngemäß ja, aber MySQL kann diese Syntax nicht. Bleibt also der
sogenannte Trigger.

komplettes Beispiel aus dem Handbuch (suche mal nach CREATE TRIGGER oder CREATE PROCEDURES)
Code:
In MySQL 5.1, you can write triggers containing direct references to tables by name, such as the trigger named testref shown in
this example:

CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);

delimiter |

CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;

|
delimiter ;

INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

Suppose that you insert the following values into table test1 as shown here:

mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
Trigger lassen sich in etwa mit Datenbank-Ereignissen gleichsetzen. Nach dem Motto: "Wenn INSERT oder UPDATE oder DELETE auf dieser Tabelle, dann mach dies.."

Trigger und Stored Procedures sind eine eigene SQL-Sprache in der Datenbank und damit "eine eigene Welt".

Grüße
Thomas

Geändert von thomas_w (05.05.2010 um 20:42 Uhr). Grund: Schreibfehler
  Mit Zitat antworten
Alt 05.05.2010, 20:50  
Gesperrt
 
Registriert seit: 15.04.2010
Beiträge: 49
PHP-Kenntnisse:
Anfänger
juice122 ist in Verruf geraten
Standard

Alles klar dann probier ich mal das Beispiel aus und vergleich die Laufzeiten.

Weißt du wie's da ist mit dem Ressourcenverbrauch? Ist der ungemein höher oder braucht man sich darüber eher keine Gedanken machen?
juice122 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] Update Insert von Tabellen frank1973 Datenbanken 14 11.04.2010 18:49
mysqli_multi_query lässt Eintrag aus... Samhayne Datenbanken 8 07.02.2010 19:02
[Erledigt] Update Bild aus mysql Datenbank. YEP PHP Tipps 2009 3 05.12.2009 23:48
[Erledigt] INSERT und UPDATE gleichzeitig? estebu Datenbanken 8 05.10.2009 00:35
[Erledigt] Mysql Insert Select + Concat Hu5eL Datenbanken 14 10.06.2008 10:39
Self Join / Nested Join ? Ich hab ne Blockade... iangillan Datenbanken 11 06.01.2008 21:37
INSERT.. ON DUPLICATE KEY UPDATE cycap Datenbanken 3 26.10.2007 13:08
Verständnisprobleme bei Utf8 > Character Set > Collate erna Datenbanken 4 20.03.2007 14:08
MySQL Server startet nicht mehr richtig... Datenbanken 16 03.03.2006 19:40
[Erledigt] mysql: INSERT und wenn vorhanden UPDATE Datenbanken 7 07.01.2006 09:54
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
[Erledigt] MySQL-DB gibt keine Daten zurück!!! Datenbanken 4 21.12.2004 21:00
dem verzweifeln nahe PHP Tipps 2004 26 24.10.2004 17:28
mysql - update query Unbekanntes_Pferd PHP Tipps 2004 18 13.09.2004 13:25
Zeile einfach überspringen bei Unique-Verletzung tapferesschneiderlein Datenbanken 6 03.09.2004 14:29

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
update into, insert into update, http://www.php.de/datenbanken/67653-mysql-insert-into-oder-update-verknuepft-einem-query.html, mysql insert into where, mysql insert or update, mysql update insert, insert into oder update, insert into or update, mysql insert into, update insert into, mysql unterschied update insert, insert or update into, mysql update into, php update into, mysql query update, mysql update wenn zeile schon existiert, sql insert und update verknüpfen, mysql update query, mysql insert update, mysql insert or update if exists

Alle Zeitangaben in WEZ +2. Es ist jetzt 10:17 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum