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

Phân tích cú pháp &So sánh dữ liệu bằng Coldfusion &MySQL

Cả hai phản ứng đều có khả năng xảy ra. Chỉ để mở rộng các tùy chọn của bạn một chút ..

Tùy chọn số 1

NẾU mySQL hỗ trợ một số loại băm, trên cơ sở mỗi hàng , bạn có thể sử dụng một biến thể của đề xuất của comodoro để tránh bị xóa khó.

Xác định Đã thay đổi

Để xác định các thay đổi, hãy thực hiện một phép nối bên trong trên khóa chính và kiểm tra các giá trị băm. Nếu chúng khác nhau, sản phẩm đã được thay đổi và cần được cập nhật:

    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued  = 0
    WHERE  tmp.TheRowHash <> p.TheRowHash

Xác định Đã xóa

Sử dụng một phép nối bên ngoài đơn giản để xác định các bản ghi không tồn tại trong bảng tạm thời và gắn cờ chúng là "đã xóa"

    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL

Xác định Mới

Cuối cùng, sử dụng một nối bên ngoài tương tự để chèn bất kỳ sản phẩm "mới" nào.

    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    WHERE  p.ProductID IS NULL

Tùy chọn số 2

Nếu việc băm mỗi hàng không khả thi, thì phương pháp thay thế là một biến thể của đề xuất của Sharondio .

Thêm cột "trạng thái" vào bảng tạm thời và gắn cờ tất cả các bản ghi đã nhập là "mới", "đã thay đổi" hoặc "không thay đổi" thông qua một loạt các phép nối. (Giá trị mặc định nên được "thay đổi").

Xác định UN-Thay đổi

Trước tiên, hãy sử dụng một phép nối bên trong, trên tất cả các trường, để xác định các sản phẩm KHÔNG thay đổi. (Lưu ý, nếu bảng của bạn chứa bất kỳ trường nào có thể làm trống, hãy nhớ sử dụng một cái gì đó như coalesce Nếu không, kết quả có thể bị sai lệch vì null giá trị không bằng bất cứ thứ gì.

    UPDATE  Products_Temp tmp INNER JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'Unchanged'
    WHERE   p.ProductName = tmp.ProductName
    AND     p.Stock = tmp.Stock
    ... 

Xác định Mới

Giống như trước đây, sử dụng một phép nối bên ngoài để xác định các bản ghi "mới".

    UPDATE  Products_Temp tmp LEFT JOIN Products p ON tmp.ProductID = p.ProductID
    SET     tmp.Status = 'New'
    WHERE   p.ProductID IS NULL

Bằng quá trình loại bỏ, tất cả các bản ghi khác trong bảng tạm thời được "thay đổi". Khi bạn đã tính toán các trạng thái, bạn có thể cập nhật bảng Sản phẩm:

    /*  update changed products */
    UPDATE Products p INNER JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.ProductName = tmp.ProductName
           , p.Stock = tmp.Stock
           , ...
           , p.DateLastChanged = now()
           , p.IsDiscontinued = 0
    WHERE  tmp.status = 'Changed'

    /*  insert new products */
    INSERT INTO Products ( ProductName, Stock, DateLastChanged, IsDiscontinued, .. )
    SELECT tmp.ProductName, tmp.Stock, now() AS DateLastChanged, 0 AS IsDiscontinued, ...
    FROM   Products_Temp tmp
    WHERE  tmp.Status = 'New'

    /* flag deleted records */
    UPDATE Products p LEFT JOIN Products_Temp tmp ON tmp.ProductID = p.ProductID
    SET    p.DateLastChanged = now()
           , p.IsDiscontinued = 1
    WHERE  tmp.ProductID IS NULL


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để thêm nhận xét vào bảng hoặc cột trong mysql bằng SQLAlchemy?

  2. Làm cách nào để cập nhật nếu tồn tại, chèn nếu không (AKA nâng cấp hoặc hợp nhất) trong MySQL?

  3. Mã lỗi MySQL:1175 trong khi CẬP NHẬT (MySQL-Workbench so với bảng điều khiển)

  4. Tìm nạp tất cả các hàng dựa trên truy vấn vào một mảng

  5. mysql:SOURCE lỗi 2?