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

Theo dõi dữ liệu mới trong bảng MySQL

Câu hỏi của bạn vẫn chưa rõ ràng. Chỉ giám sát một loại thay đổi - "dữ liệu mới" (INSERT) theo tiêu đề - phức tạp hơn việc phát hiện bất kỳ thay đổi nào (theo I want to detect the Changes in my table trong nhận xét đơn giản hơn).

MySql cung cấp phương tiện để lấy tổng tổng của một bảng:

checksum table TABLE_NAME [QUICK | EXTENDED]

Kết quả MySQL Workbench cho bảng InnoDB và MyISAM:

Bằng cách theo dõi các thay đổi trong các giá trị trả về đó, bạn có thể phát hiện bất kỳ thay đổi nào. Nhưng lưu ý:

  • Bảng phải được tạo bằng Checksum = 1 tùy chọn
  • QUICK tùy chọn này không hoạt động trên các bảng InnoDB trước phiên bản 5.7.2 (IIRC và phiên bản Community hiện tại là 5.7.14).

May mắn thay, nếu bạn không chỉ định một tùy chọn, MySQL dường như chọn tùy chọn nhanh nhất sẽ trả về một giá trị. Vì vậy, việc theo dõi các thay đổi theo bảng trên Bộ hẹn giờ trở nên dễ dàng:

' Track last checksum by table
Friend Class TableItem
    Public Property Name As String
    Public Property CheckSum As Int64

    Public Sub New(n As String)
        Name = n
        CheckSum = 0
    End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)

Khởi tạo:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

Sự kiện Timer Tick:

' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "

Using dbcon As New MySqlConnection(mySQLConnStr)
    dbcon.Open()
    Using cmd As New MySqlCommand(sql, dbcon)
        ' loop thru collection, polling one at a time
        For Each tbl As TableItem In Tables
            cmd.CommandText = String.Format(sql, tbl.Name)

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                If rdr.Read Then
                    Dim thisResult = rdr.GetInt64(1)

                    ' ignore the first result
                    If tbl.CheckSum = 0 Then
                        tbl.CheckSum = thisResult
                        Return
                    End If
                    ' save the last non-zed value
                    If tbl.CheckSum <> thisResult Then
                        tbl.CheckSum = thisResult
                        ' method to do something when changed:
                        TableChanged(tbl.Name)
                    End If

                End If
            End Using
        Next
    End Using
End Using

Phương pháp của tôi làm điều gì đó, chúng tôi chỉ báo cáo các thay đổi đối với hộp danh sách:

Private Sub TableChanged(tbl As String)
    lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
                               DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub

Để thực sự theo dõi thứ gì đó giống như CHỈ INSERTS, bạn cần sử dụng một số loại bảng nhật ký. Thêm trình kích hoạt cập nhật bảng đó bằng TimeStamp và có thể là mã hành động ("chèn", "xóa"). Sau đó, chỉ cần kiểm tra TimeStamp để tìm các thay đổi, có thể lọc ra các hành động không xem.

Riêng một phiên bản để xem nhiều bảng hoặc một số sự kiện thay đổi nhất định sẽ hoạt động tốt hơn như một lớp. Mã hẹn giờ có thể được đóng gói và nó có thể tạo ra các sự kiện thay đổi bảng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách đảm bảo cơ sở dữ liệu MySQL của bạn được bảo mật

  2. Nhóm theo tháng và năm trong MySQL

  3. Làm thế nào để tạo cơ sở dữ liệu localhost bằng cách sử dụng mysql?

  4. Tự động xóa dữ liệu đường giao nhau cùng với XÓA bản ghi?

  5. Cách tốt nhất để lưu trữ Cài đặt của ứng dụng PHP?