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

Наблюдавайте нови данни в MySQL таблица

Въпросът ви остава неясен. Наблюдението на само един тип промяна - "нови данни" (INSERT) според заглавието - е по-сложно от откриването на всяка промяна (съгласно I want to detect the Changes in my table в коментарите, което е по-просто).

MySql предоставя средствата за получаване на контролната сума на таблица:

checksum table TABLE_NAME [QUICK | EXTENDED]

Резултати от MySQL Workbench за таблица InnoDB и MyISAM:

Като наблюдавате промените в тези върнати стойности, можете да откриете всяка промяна. Но имайте предвид:

  • Таблицата трябва да е създадена с Checksum = 1 опция
  • QUICK опцията не работи на InnoDB таблици преди версия 5.7.2 (IIRC и текущата версия на Общността е 5.7.14).

За щастие, ако не посочите опция, MySQL изглежда избира най-бързата, която ще върне стойност. Така става лесно да се проследяват промените по таблица на таймер:

' 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)

Инициализирайте:

Timer1.Enabled = True

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

Събитието Timer Timer:

' 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

Моят метод „Направи нещо“, като просто отчитаме промените в списъчно поле:

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

За да наблюдавате действително нещо като само INSERTS, ще трябва да използвате някакъв вид регистрационна таблица. Добавете тригер, който актуализира тази таблица с TimeStamp и може би код за действие („вмъкване“, „изтриване“). След това просто проверете TimeStamp за промени, може би филтриране на действия, които не са за гледане.

По-специално версия за гледане на множество таблици или определени събития за промяна ще работи по-добре като клас. Кодът на таймера може да бъде капсулиран и може да предизвика събития за промени в таблицата.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как и кога да използваме SLEEP() правилно в MySQL?

  2. Регистрирайте ЗАПИСКИ, не използвайки INDEX - MySQL

  3. съхраняване на JSON данни в mysql

  4. Преименувайте името на таблицата на Amazon RDS на главна буква, извежда грешка

  5. Безплатни методи за поправяне на повредена MySQL база данни