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

Как да преведем PostgreSQL merge_db (известна още като upsert) функция в MySQL

Тествано на MySQL 5.5.14.

CREATE TABLE db (a INT PRIMARY KEY, b TEXT);

DELIMITER //
CREATE PROCEDURE merge_db(k INT, data TEXT) 
BEGIN
    DECLARE done BOOLEAN;
    REPEAT
        BEGIN
            -- If there is a unique key constraint error then 
            -- someone made a concurrent insert. Reset the sentinel
            -- and try again.
            DECLARE ER_DUP_UNIQUE CONDITION FOR 23000;
            DECLARE CONTINUE HANDLER FOR ER_DUP_UNIQUE BEGIN
                SET done = FALSE;
            END;

            SET done = TRUE;
            SELECT COUNT(*) INTO @count FROM db WHERE a = k;
            -- Race condition here. If a concurrent INSERT is made after
            -- the SELECT but before the INSERT below we'll get a duplicate
            -- key error. But the handler above will take care of that.
            IF @count > 0 THEN 
                UPDATE db SET b = data WHERE a = k;
            ELSE 
                INSERT INTO db (a, b) VALUES (k, data);
            END IF;
        END;
    UNTIL done END REPEAT;
END//

DELIMITER ;

CALL merge_db(1, 'david');
CALL merge_db(1, 'dennis');

Някои мисли:

  • Не можете първо да направите актуализация и след това да проверите @ROW_COUNT() защото връща броя на действително променените редове. Това може да е 0, ако редът вече има стойността, която се опитвате да актуализирате.
  • Също така, @ROW_COUNT() не е безопасно за репликация.
  • Можете да използвате REPLACE...INTO .
  • Ако използвате InnoDB или таблица с поддръжка на транзакции, може да сте в състояние да използвате SELECT...FOR UPDATE (непроверено).

Не виждам предимство на това решение пред простото използване на INSERT...ON DUPLICATE KEY UPDATE .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL/Hibernate - Как да отстраня грешки в MySQL пул връзка, която продължава да отпада?

  2. Как да използвам множество бази данни в уеб приложение на PHP?

  3. Безопасен ли е MySQL конектор/JDBC нишка?

  4. SQL DELETE с JOIN друга таблица за условие WHERE

  5. Качете изображение с помощта на PHP и mySQL