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.
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
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.