Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Cách dịch hàm merge_db (hay còn gọi là upert) của PostgreSQL sang MySQL

Đã thử nghiệm trên 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');

Vài suy nghĩ:

  • Bạn không thể cập nhật trước rồi kiểm tra @ROW_COUNT() vì nó trả về số hàng đã thực sự thay đổi. Đây có thể là 0 nếu hàng đã có giá trị mà bạn đang cố gắng cập nhật.
  • Ngoài ra, @ROW_COUNT() không an toàn sao chép.
  • Bạn có thể sử dụng REPLACE...INTO .
  • Nếu sử dụng InnoDB hoặc bảng có hỗ trợ giao dịch, bạn có thể sử dụng SELECT...FOR UPDATE (chưa được kiểm tra).

Tôi không thấy lợi ích gì cho giải pháp này khi chỉ sử dụng 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. DataTable.Load hiển thị ít hàng hơn DataReader nguồn

  2. Python 'float64' không thể được chuyển đổi thành loại MySQL nhưng trong truy vấn thủ công, không có vấn đề gì

  3. MySQL Không thể giảm chỉ mục cần thiết trong một ràng buộc khóa ngoại

  4. Java combobox swing

  5. Kết nối với MySQL từ Android bằng JDBC