tag:forum.selfhtml.org,2005:/self ON DUPLICATE KEY UPDATE und WHERE – SELFHTML-Forum 2021-03-12T23:30:27Z https://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785682?srt=yes#m1785682 Bernhard 2021-03-12T17:18:57Z 2021-03-12T17:18:57Z ON DUPLICATE KEY UPDATE und WHERE <p>Hallo nochmal,</p> <p>nachdem ich nun meine Rechnungen gemacht habe, würde ich diese gerne in die Datenbank schreiben. Wenn für das Paper und den User schon ein Betrag vorhanden ist, soll er überschrieben werden, falls nicht ein neuer Datensatz angelegt werden.</p> <pre><code class="block">INSERT INTO mathe SET betrag=:betrag ON DUPLICATE KEY UPDATE betrag=:betrag WHERE id_paper=100 AND user=10 </code></pre> <p>Doch ich bekomme einen Fehler, mit dem ich mir nicht zu helfen weris.</p> <p>Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to</p> https://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785683?srt=yes#m1785683 Rolf B 2021-03-12T17:40:34Z 2021-03-12T17:40:34Z ON DUPLICATE KEY UPDATE und WHERE <p>Hallo Bernhard,</p> <p><a href="https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html" rel="nofollow noopener noreferrer">Lies das ver*piieep* - äh - vorzügliche Handbuch</a></p> <p>Die SET Klausel gehört zum UPDATE-, nicht zum INSERT-Befehl. Auch in der ON DUPLICATE Klausel des INSERT steht kein SET. Und Du musst im INSERT-Teil alle Spalten der Zeile angeben (außer AUTOINCREMENT-Spalten). Es ist ja eine neue Zeile.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> https://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785684?srt=yes#m1785684 MudGuard http://www.andreas-waechter.de/ 2021-03-12T18:40:17Z 2021-03-12T18:40:17Z ON DUPLICATE KEY UPDATE und WHERE <p>Hi,</p> <blockquote> <p>nachdem ich nun meine Rechnungen gemacht habe, würde ich diese gerne in die Datenbank schreiben. Wenn für das Paper und den User schon ein Betrag vorhanden ist, soll er überschrieben werden, falls nicht ein neuer Datensatz angelegt werden.</p> </blockquote> <p>Umgekehrt: Du fügst einen neuen Datensatz hinzu - es sei denn, der Key ist schon vorhanden.</p> <p>Das setzt also erstmal einen Unique Key voraus.</p> <blockquote> <pre><code class="block">INSERT INTO mathe SET betrag=:betrag ON DUPLICATE KEY UPDATE betrag=:betrag WHERE id_paper=100 AND user=10 </code></pre> </blockquote> <p>ALso erst mal das Insert:</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> mathe <span class="token punctuation">(</span>betrag<span class="token punctuation">,</span> id_paper<span class="token punctuation">,</span> <span class="token keyword">user</span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span>:betrag<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span><span class="token punctuation">;</span> </code></pre> <p>Ich gehe mal davon aus, daß auf id_paper + user der Unique-Key existiert.</p> <p>Dann würde das INSERT scheitern, wenn der Datensatz mit id_paper 100 und user 10 schon existiert.</p> <pre><code class="block language-sql"><span class="token keyword">INSERT</span> <span class="token keyword">INTO</span> mathe <span class="token punctuation">(</span>betrag<span class="token punctuation">,</span> id_paper<span class="token punctuation">,</span> <span class="token keyword">user</span><span class="token punctuation">)</span> <span class="token keyword">VALUES</span> <span class="token punctuation">(</span>:betrag<span class="token punctuation">,</span> <span class="token number">100</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">)</span> <span class="token keyword">ON</span> DUPLIKATE <span class="token keyword">KEY</span> <span class="token keyword">UPDATE</span> betrag <span class="token operator">=</span> :betrag<span class="token punctuation">;</span> </code></pre> <p>Ein WHERE braucht's für das UPDATE nicht, denn welche Zeile geändert werden soll, ist ja schon durch den unique key festgelegt.</p> <p>cu,<br> Andreas a/k/a MudGuard</p> https://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785690?srt=yes#m1785690 dedlfix 2021-03-12T23:12:13Z 2021-03-12T23:12:13Z ON DUPLICATE KEY UPDATE und WHERE <p>Tach!</p> <blockquote> <p><a href="https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html" rel="nofollow noopener noreferrer">Lies das ver*piieep* - äh - vorzügliche Handbuch</a></p> <p>Die SET Klausel gehört zum UPDATE-, nicht zum INSERT-Befehl.</p> </blockquote> <p><a href="https://dev.mysql.com/doc/refman/8.0/en/insert.html" rel="nofollow noopener noreferrer">Ebenda</a>: doch, zumindest bei MySQL.</p> <p>Das WHERE gehört nicht zum Insert. Die Auswahl des eventuell vorhandenen Datensatzes ergibt sich aus den Werten im <code>SET assignment_list</code> oder <code>(colnames) VALUES (values)</code>.</p> <p>dedlfix.</p> https://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785692?srt=yes#m1785692 Rolf B 2021-03-12T23:30:27Z 2021-03-12T23:30:27Z ON DUPLICATE KEY UPDATE und WHERE <p>Hallo dedlfix,</p> <p>uuups - die Syntax 2 hab ich übersehen. Das ist aber wirklich MYSQL Spezial, der MS SQL Server und IBM DB2, meine Heimat-DBs, kennen sowas nicht.</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div>