tag:forum.selfhtml.org,2005:/selfON DUPLICATE KEY UPDATE und WHERE – SELFHTML-Forum2021-03-12T23:30:27Zhttps://forum.selfhtml.org/self/2021/mar/12/on-duplicate-key-update-und-where/1785682?srt=yes#m1785682Bernhard2021-03-12T17:18:57Z2021-03-12T17:18:57ZON 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#m1785683Rolf B2021-03-12T17:40:34Z2021-03-12T17:40:34ZON 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#m1785684MudGuardhttp://www.andreas-waechter.de/2021-03-12T18:40:17Z2021-03-12T18:40:17ZON 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#m1785690dedlfix2021-03-12T23:12:13Z2021-03-12T23:12:13ZON 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#m1785692Rolf B2021-03-12T23:30:27Z2021-03-12T23:30:27ZON 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>