Eindeutigen Wert bei UPDATE ersetzen

Andy_aus_M

Benutzer
Beiträge
11
Mit
Code:
UPDATE products_attributes_download SET products_attributes_maxcount = REPLACE(products_attributes_maxcount, "0", "30")

ersetze ich den Wert 0 mit 30.

Das funktioniert ja auch ganz gut ABER !

Wenn dort keine 0 sondern schon eine 30 steht wird aus dem Ergebnis keine 30 sondern 330.

Wie muß es bitte aussehen, damit der Wert 0 eindeutig ist ?

Danke für eine Rückmeldung
 
Werbung:
Zunächst die Frage:
Welcher Datentyp ist die Spalte products_attributes_maxcount?
Anhand des Namens würde ich hoffen, es ist integer oder ein vergleichbarer Zahlentyp.

Dann:
Deine Funktion replace arbeitet aber mit Texttypen.

Was nun geschieht nennt sich implizite Konvertierung. Die Datenbank ist so "freundlich" und übernimmt für Dich die Konvertierung der Typen.
mySQL ist da besonders "freundlich" und nicht sehr wählerisch in der Typkonverierung.
Was würdest Du als Ergebnis erhalten, wenn der Wert 300 in der Spalte steht?

Der nächste Punkt:
Relationale Datenbanken arbeiten Mengenorientiert. Daher ist es ziemlich üblich, alle möglichen DML (DataManipulationLanguage) Statements mit Where Bedingungen zu versehen. Also mit Kriterien, die betroffene Menge einschränken.
Du willst die Änderung nur bei 0 haben, wird umgesetzt als
Code:
 where products_attributes_maxcount = 0
Damit hast Du ein explizites Kriterium, unter welcher Bedingung Werte ersetzt werden sollen.
Und den Ersatzwert gibst Du ebenfalls exakt vor: 30
ergibt
Code:
 update products_attributes_download set products_attributes_maxcount = 30
 where products_attributes_maxcount = 0
So und zuletzt:
Die Kriterien in der where Clause müssen keinen Zusammenhang mit der Spalte haben, die Du ändern willst.
Code:
 update products_attributes_download set products_attributes_maxcount = 30
 where products_id = 4711 and product_attribute_class = 'FOOD'
Dieses Statement würde vermutlich nur einen Datensatz ändern, sicherheitshalber nur für eine bestimmte Art Datensätze.
Wenn der "Probelauf" mit der Einschränkung auf eine ID funktioniert und sich das System sauber verhält würde man vielleicht die Einschränkung auf die eine ID 4711 weglassen und alle Datensätze der Klasse 'FOOD' ändern.

Das sind alles SQL Grundlagen, solltest Du Dir vielleicht mal genauer anschauen.
 
Jetzt funktioniert es

Code:
UPDATE products_attributes_download SET products_attributes_maxcount = REPLACE(products_attributes_maxcount, "0", "30")
 WHERE products_attributes_maxcount = '0'

Mit WHERE hatte ich schon probiert aber immer an der falschen Stelle gesetzt
 
Jetzt funktioniert es
Oh, ja, das geht auch.
Vergiß bitte das REPLACE in dem "funktionierenden" Statement und schau Dir meine Lösung noch mal an.
Du willst die Aufgabe, einen spezifischen Wert zu ändern, nicht übererfüllen.

UPDATE
SET
WHERE

ist Dein "Replace"!

Update
set Replace
where
ist doppelt gemoppelt und fehlerträchtig.
 
ist doppelt gemoppelt und fehlerträchtig

Danke, werde ich noch ein wenig weiterüben.

Es wird aber nur einmal benötigt wenn ich mit dem Shop fertig bin und sollte trotzdem hoffentlich einmal ohne Fehler funktionieren.

Ich werde mal mit eine DB-Kopie üben.
 
Es wird aber nur einmal benötigt
Wie gesagt, das sind Grundlagen.
Wie oft Du genau dieses Statement brauchst, ist ziemlich egal. Deine Herangehensweise lässt befürchten, dass Du viele ähnliche Probleme haben wirst, wenn Du Dir nicht mehr Basiswissen aneignest.
Du brauchst nicht mal eine Kopie Deiner DB (wobei die Idee eine Kopie zum Üben zu nehmen schon viel besser ist, als mit dem Original). Es gibt viele Onlinedatenbanken, Kurse und Tutorials, mit denen man üben kann.
 
Und Konzentration brauchst Du natürlich auch.
Du hast das WHERE .. vergessen.

In einem Produktiven System wirst Du mit diesem Statement alle Datensätze aktualisieren, die es in der Tabelle gibt. Vermutlich willst Du das nicht.
Wenn Du soweit bist, dass Du mal 2 oder mehr Produkte verwaltest, wirst Du es aber im Zweifel von allein merken.
 
#
In einem Produktiven System wirst Du mit diesem Statement alle Datensätze aktualisieren, die es in der Tabelle gibt.
#
Das möchte ich ja auch, da es feste Werte sind und nur einmal vergeben werden.
Ich müsste diese Einträge sonst 3744 mal bei der Artikeleinstellung extra eingeben und das 2 mal (maxcount und maxdays)
und das kostet Zeit

aber der Hinweis mit WHERE ist trotzdem notiert 👍
 
In einem Produktiven System wirst Du mit diesem Statement alle Datensätze aktualisieren, die es in der Tabelle gibt.
#
Das möchte ich ja auch, da es feste Werte sind und nur einmal vergeben werden.
Ich müsste diese Einträge sonst 3744 mal bei der Artikeleinstellung extra eingeben und das 2 mal (maxcount und maxdays)
und das kostet Zeit
Sorry, das ergibt für mich keinen Sinn.

Wenn Du das:
UPDATE products_attributes_download SET products_attributes_maxcount =30
in einem produktiven System einsetzt, ohne where Clause, dann reicht dieser eine Aufruf, um 1, 2, 3744 oder 47 Millionen Datensätze zu ändern.

Wenn Du jetzt sagst, die sollen auch alle gleich sein, okay. Dann wäre nur die Frage, warum man das für jedes Produkt speichert, ohne dass es sich unterscheidet. Vielleicht ist es nur ein Initialwert, und der ändert sich dann bei einzelnen Produkten doch irgendwann oder soll änderbar sein.
Meinetwegen.
Das passt dennoch nicht zu der ursprünglichen Frage und Deiner Anforderung, ein Replace zu verwenden. Wenn alle Datensätze auf 30 gesetzt werden sollen, warum dann überhaupt ein Replace?
 
Evtl. war die eigentliche Frage von mir mit dem Beispiel falsch gestellt.

Es geht um eine Gambio Shop mit 26 Grafiken in 3 Formaten und 48 unterschiedlichen Farben als Download-Artikel.

Es sind 26 Artikel in 3 Formaten ( PNG, SVG, WEBP) und jeweils 48 Farben als Download verfügbar.

Jetzt muß ich jedem Artikel als Auswahl die Farbe anbieten.
Und damit für jeden Artikel, 48 Möglichkeiten für einen Download einrichten.
Dabei kann ich die Anzahl der verfügbaren Downloads und die Anzahl der möglichen Tage angeben.

26x3x48=3744 mal maxdays und maxcout händisch eintragen kostet Zeit.

Diese Werte bleiben aber FEST da die Berechnung im Kundenkonto oder sonstwo gespeichert wird.

Das sind nur Vorgaben, die jeder Kunde sieht, wenn ein Artikel zum Download bereit steht.
Das runterzählen je Kunde und Download findet ja irgendwo anders statt.....
Deswegen bleien die Werte immer gleich.
Sonst würde jeder neue Kunde andere Werte sehen
 
Es geht um eine Gambio Shop mit 26 Grafiken in 3 Formaten und 48 unterschiedlichen Farben als Download-Artikel.

Es sind 26 Artikel in 3 Formaten ( PNG, SVG, WEBP) und jeweils 48 Farben als Download verfügbar.

Jetzt muß ich jedem Artikel als Auswahl die Farbe anbieten.
Und damit für jeden Artikel, 48 Möglichkeiten für einen Download einrichten.
Dabei kann ich die Anzahl der verfügbaren Downloads und die Anzahl der möglichen Tage angeben.

26x3x48=3744 mal maxdays und maxcout händisch eintragen kostet Zeit.

Diese Werte bleiben aber FEST da die Berechnung im Kundenkonto oder sonstwo gespeichert wird.

Du machst das prinzipiell falsch.

Mal angenommen, Du hast folgende Artikel, Farben und Formate:

Code:
postgres=# create table artikel (id int generated always as identity primary key, name text);
CREATE TABLE
postgres=# create table farbe (id int generated always as identity primary key, name text);
CREATE TABLE
postgres=# create table format (id int generated always as identity primary key, name text);
CREATE TABLE
postgres=# insert into artikel (name) values('Butter');
INSERT 0 1
postgres=# insert into artikel (name) values('Käse');
INSERT 0 1
postgres=# insert into artikel (name) values('Wurst');
INSERT 0 1
postgres=# insert into farbe (name) values('Rot');
INSERT 0 1
postgres=# insert into farbe (name) values('Gelb');
INSERT 0 1
postgres=# insert into farbe (name) values('Grün');
INSERT 0 1
postgres=# insert into format (name) values('PNG');
INSERT 0 1
postgres=# insert into format (name) values('SVG');
INSERT 0 1
postgres=# insert into format (name) values('WEBP');
INSERT 0 1

Was Du jetzt suchst, also die Kombination all dieser Werte, ist ein CROSS JOIN dieser Tabellen:

Code:
postgres=# select a.name, f1.name, f2.name from artikel a cross join farbe f1 cross join format f2;
  name  | name | name 
--------+------+------
 Butter | Rot  | PNG
 Butter | Rot  | SVG
 Butter | Rot  | WEBP
 Butter | Gelb | PNG
 Butter | Gelb | SVG
 Butter | Gelb | WEBP
 Butter | Grün | PNG
 Butter | Grün | SVG
 Butter | Grün | WEBP
 Käse   | Rot  | PNG
 Käse   | Rot  | SVG
 Käse   | Rot  | WEBP
 Käse   | Gelb | PNG
 Käse   | Gelb | SVG
 Käse   | Gelb | WEBP
 Käse   | Grün | PNG
 Käse   | Grün | SVG
 Käse   | Grün | WEBP
 Wurst  | Rot  | PNG
 Wurst  | Rot  | SVG
 Wurst  | Rot  | WEBP
 Wurst  | Gelb | PNG
 Wurst  | Gelb | SVG
 Wurst  | Gelb | WEBP
 Wurst  | Grün | PNG
 Wurst  | Grün | SVG
 Wurst  | Grün | WEBP
(27 rows)

postgres=#


Wenn Du jetzt zu jedem dieser Werte noch 3 oder 42 andere konstante Werte hast, kann die diese entweder in der Applikation oder beim SELECT angeben. Beispiel für SELECT:

Code:
postgres=# select a.name, f1.name, f2.name, 42 konstante1, 4711 konstante2, '0815' konstante3 from artikel a cross join farbe f1 cross join format f2;
  name  | name | name | konstante1 | konstante2 | konstante3 
--------+------+------+------------+------------+------------
 Butter | Rot  | PNG  |         42 |       4711 | 0815
 Butter | Rot  | SVG  |         42 |       4711 | 0815
 Butter | Rot  | WEBP |         42 |       4711 | 0815
 Butter | Gelb | PNG  |         42 |       4711 | 0815
 Butter | Gelb | SVG  |         42 |       4711 | 0815
 Butter | Gelb | WEBP |         42 |       4711 | 0815
 Butter | Grün | PNG  |         42 |       4711 | 0815
 Butter | Grün | SVG  |         42 |       4711 | 0815
 Butter | Grün | WEBP |         42 |       4711 | 0815
 Käse   | Rot  | PNG  |         42 |       4711 | 0815
 Käse   | Rot  | SVG  |         42 |       4711 | 0815
 Käse   | Rot  | WEBP |         42 |       4711 | 0815
 Käse   | Gelb | PNG  |         42 |       4711 | 0815
 Käse   | Gelb | SVG  |         42 |       4711 | 0815
 Käse   | Gelb | WEBP |         42 |       4711 | 0815
 Käse   | Grün | PNG  |         42 |       4711 | 0815
 Käse   | Grün | SVG  |         42 |       4711 | 0815
 Käse   | Grün | WEBP |         42 |       4711 | 0815
 Wurst  | Rot  | PNG  |         42 |       4711 | 0815
 Wurst  | Rot  | SVG  |         42 |       4711 | 0815
 Wurst  | Rot  | WEBP |         42 |       4711 | 0815
 Wurst  | Gelb | PNG  |         42 |       4711 | 0815
 Wurst  | Gelb | SVG  |         42 |       4711 | 0815
 Wurst  | Gelb | WEBP |         42 |       4711 | 0815
 Wurst  | Grün | PNG  |         42 |       4711 | 0815
 Wurst  | Grün | SVG  |         42 |       4711 | 0815
 Wurst  | Grün | WEBP |         42 |       4711 | 0815
(27 rows)

postgres=#
 
Evtl. war die eigentliche Frage von mir mit dem Beispiel falsch gestellt.
Mag sein, es geht am Ende nur darum, das gleiche Verständnis des Problems und der Lösung zu haben und wie die Lösung in den Anwendungsfall passt, also eine angemessene oder sogar gute Lösung zu finden.
Ein Replace wie Du es zu Anfang einsetzt, ändert nicht einfach einen Wert. Das geschieht nur unter bestimmten Bedingungen, hier nur bei Eingangsparameter =0. Andere Werte werden nicht ersetzt. (Ob andere Werte überhaupt vorkommen, ist zu dem Zeitpunkt Geheimwissen von Dir.) Das hat mich zu der Annahme gebraucht, Du möchtest nur 0 Werte ändern und es existieren andere Werte.
Sollen ALLE Datensätze bedingungslos auf einen fixen Wert aktualisiert werden, braucht man natürlich keine Where Clause.
Aber auch kein Replace. (Was hier dann auch falsch eingesetzt wurde)

Was Du über den Shop geschrieben hast, finde ich etwas eigentartig. Kann man als Kunde seine Settings und Counter ändern, indem man den Cache oder die Cookies löscht? Kann mir aber am Ende auch egal sein.
 
Werbung:
Zurück
Oben