Mysql
 sql >> база данни >  >> RDS >> Mysql

SQL стандартно извикване UPSERT

Единственото решение, което се поддържа както от MySQL, така и от HSQLDB, е да се запитат редовете, които възнамерявате да замените, и условно INSERT или UPDATE. Това означава, че трябва да напишете повече код на приложението, за да компенсирате разликите между реализациите на RDBMS.

  1. ЗАПОЧНЕТЕ ТРАНЗАКЦИЯТА.
  2. ИЗБЕРЕТЕ... ЗА АКТУАЛИЗИРАНЕ.
  3. Ако SELECT намери редове, след това UPDATE.
  4. Иначе, INSERT.
  5. ЗАВЪРЖИ.

MySQL не поддържа оператора ANSI SQL MERGE. Поддържа ЗАМЕСТВАНЕ и ВМЪКВАНЕ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ. Вижте моя отговор на " INSERT IGNORE" срещу "INSERT ... ПРИ АКТУАЛИЗИРАНЕ НА ДУБЛИКАТ КЛЮЧ" за повече информация.

Re коментари:Да, друг подход е просто да опитате INSERT и да видите дали е успешен. В противен случай направете АКТУАЛИЗИРАНЕ. Ако опитате INSERT и той удари дублиран ключ, той ще генерира грешка, която се превръща в изключение в някои клиентски интерфейси. Недостатъкът на това в MySQL е, че генерира нов идентификатор за автоматично увеличение, дори ако INSERT не успее. Така че в крайна сметка ще получите пропуски. Знам, че пропуските в последователността на автоматично нарастване обикновено не са нещо, за което да се притеснявате, но помогнах на клиент миналата година, който имаше пропуски от 1000-1500 между успешните вмъквания поради този ефект и резултатът беше, че те изчерпаха обхвата на INT в техния първичен ключ.

Както казва @baraky, вместо това може да се опита първо да UPDATE и ако това засяга нула редове, тогава вместо това направете INSERT. Коментарът ми за тази стратегия е, че АКТУАЛИЗИРАНЕТО на нулеви редове не е изключение – ще трябва да проверите за „брой засегнати редове“ след АКТУАЛИЗИРАНЕТО, за да разберете дали е „успешно“ или не.

Но запитването на броя на засегнатите редове ви връща към първоначалния проблем:трябва да използвате различни заявки в MySQL спрямо HSQLDB.

HSQLDB:

CALL DIAGNOSTICS(ROW_COUNT);

MySQL:

SELECT ROW_COUNT();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL времева разлика в рамките на една таблица

  2. Съхранение на разрешения за приложение в база данни

  3. Избягвайте повтарящи се записи, показвани в MySQL / PHP

  4. MySQL 8 игнорира цели числа

  5. Най-добрият начин за съхраняване на връзка много към много в MySQL?